猿问

如何使用ExecutorService等待所有线程完成?

如何使用ExecutorService等待所有线程完成?

我需要一次执行一些任务4,如下所示:

ExecutorService taskExecutor = Executors.newFixedThreadPool(4);while(...) {
    taskExecutor.execute(new MyTask());}//...wait for completion somehow

一旦它们全部完成,如何通知我?现在,我想不出有什么比设置一些全局任务计数器并在每个任务结束时减少它更好的了,然后在无限循环中监视这个计数器使其变为0;或者得到一个期货列表和无限循环监视器是对所有任务都是Done的。没有无限循环的更好的解决方案是什么?

谢谢。


POPMUISE
浏览 2028回答 3
3回答

智慧大石

用伯爵唐太奇(CountDownLatch):CountDownLatch latch = new CountDownLatch(totalNumberOfTasks);ExecutorService taskExecutor = Executors.newFixedThreadPool(4);while(...) {   taskExecutor.execute(new MyTask());}try {   latch.await();} catch (InterruptedException E) {    // handle}以及在您的任务中(包含在“尝试/最后”中)latch.countDown();

米脂

ExecutorService.invokeAll()为你而做。ExecutorService&nbsp;taskExecutor&nbsp;=&nbsp;Executors.newFixedThreadPool(4);List<Callable<?>>&nbsp;tasks;&nbsp; //&nbsp;your&nbsp;tasks//&nbsp;invokeAll()&nbsp;returns&nbsp;when&nbsp;all&nbsp;tasks&nbsp;are&nbsp;completeList<Future<?>>&nbsp;futures&nbsp;=&nbsp;taskExecutor.invokeAll(tasks);

偶然的你

基本上ExecutorService你打电话shutdown()然后awaitTermination():ExecutorService&nbsp;taskExecutor&nbsp;=&nbsp;Executors.newFixedThreadPool(4);while(...)&nbsp;{ &nbsp;&nbsp;taskExecutor.execute(new&nbsp;MyTask());}taskExecutor.shutdown();try&nbsp;{ &nbsp;&nbsp;taskExecutor.awaitTermination(Long.MAX_VALUE,&nbsp;TimeUnit.NANOSECONDS);}&nbsp;catch&nbsp;(InterruptedException&nbsp;e)&nbsp;{ &nbsp;&nbsp;...}
随时随地看视频慕课网APP
我要回答