我有一个新手的问题.我有这个代码:
- public class Main
- {
- public static void main(String[] args) throws InterruptedException
- {
- // TODO Auto-generated method stub
- IntHolder aHolder=new IntHolder();
- aHolder.Number=0;
- IncrementorThread A= new IncrementorThread(1,aHolder);
- IncrementorThread B= new IncrementorThread(2,aHolder);
- IncrementorThread C= new IncrementorThread(3,aHolder);
- A.start();
- B.start();
- C.start();
- A.join();
- B.join();
- C.join();
- System.out.println("All threads completed...");
- }
- }
这将等待所有线程完成.如果我这样使用Executors:
- public class Main
- {
- public static void main(String[] args)
- {
- // TODO Auto-generated method stub
- IntHolder aHolder=new IntHolder();
- aHolder.number=0;
- IncrementalRunable A= new IncrementalRunable(1,aHolder);
- IncrementalRunable B= new IncrementalRunable(2,aHolder);
- IncrementalRunable C= new IncrementalRunable(3,aHolder);
- ExecutorService exec = Executors.newFixedThreadPool(3);
- exec.execute(A);
- exec.execute(B);
- exec.execute(C);
- //Don't know what to do here
- System.out.println("All threads completed...");
- }
- }
如何暂停主线程等待执行器中的所有线程完成,即所有线程完成工作后都应该打印“所有线程完成…”?
解决方法
- executor.shutdown();
- while (!executor.awaitTermination(24L,TimeUnit.HOURS)) {
- System.out.println("Not yet. Still waiting for termination");
- }
使用shutdown()awaitTermination()组合.
编辑:
基于@Lital的评论
- List<Callable<Object>> calls = new ArrayList<Callable<Object>>();
- calls.add(Executors.callable(new IncrementalRunable(1,aHolder)));
- calls.add(Executors.callable(new IncrementalRunable(2,aHolder)));
- calls.add(Executors.callable(new IncrementalRunable(3,aHolder)));
- List<Future<Object>> futures = executor.invokeAll(calls);
注意:所有的任务完成(通过失败或完成成功执行),invokeAll()将不会返回.