java - 等待所有任务完成

标签 java multithreading concurrency threadpool

我有一系列不同的“任务”要使用同一个线程池完成。我想测量执行每项任务所需的时间,但为此我需要等待“任务”中的每项任务(抱歉含糊不清)完成。

当只有一项任务时,我通常会这样做:

ExecutorService e = Executors.newCachedThreadPool();
for (int i=0; i<100; ++i)
    e.submit(target);
e.shutdown();
while (!e.isTerminated());

但是因为会有好几个task提交到pool,所以没法下。所有与等待任务完成有关的方法都提到“关闭请求后”。那么,如果我不想关闭它,而是等待所有线程完成,然后再提交更多任务怎么办?

这就是我想要做的:

ExecutorService e = Executors.newCachedThreadPool();
for (int i=0; i<100; ++i)
    e.submit(target);
// wait for all targets to finish
for (int i=0; i<100; ++i)
    e.submit(target); // submit different tasks
// wait... and so on

我想关闭池然后使用 prestartAllCoreThreads 再次“唤醒它”,但后来我意识到这不是 ExecutorService 方法而是 ThreadPoolExecutor 方法。这可能是一个解决方案吗?关闭它,等待,然后再次激活池?我觉得有点丑。

我还认为最自然的做法是使用 CyclicBarrier,但这似乎是一种特殊的方式,但我认为这是最合乎逻辑的事情将任何 ExecutorService 用于我正在尝试做的事情。

有什么方法可以坚持 ExecutorService 并等待所有任务完成?

最佳答案

使用 CyclicBarrier 来完成您需要的工作:

// the optionalRunnable can collect the data gathered by the tasks
CyclicBarrier b = new CyclicBarrier(numberOfTasks,optionalRunnable)

Task yourTaks = new Task(...., b);
// inside the run method call b.await() after the work is done;
executor.submit(yourTaks);

可选地,您还可以在主线程中调用 await 并将屏障实例化为 numTasks + 1。这样你就可以确定只有在处理完当前批处理后你才会将任务重新提交给执行者

关于java - 等待所有任务完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24362798/

相关文章:

multithreading - 什么是死锁?

java - Java 中不同步的 getter/setter 行为

java - 可以用给定的字符串数组构成给定的字符串吗?

java - 仅测试英文字符的 A-Z 大写

java - Android EditText 有固定的输入

java多线程 - 限制提交给ExecutorService

c++ - 在 QThread::run 中间调用一个槽

scala - akka actor适用于搜索等在线服务系统吗?

c - 如何查询多个 pthread(子线程)以了解哪一个线程终止

java - ServletContext 是 Servlet 之间共享资源的首选方式吗?