我有一个新手的问题.我有这个代码:
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()将不会返回.