我有一系列不同的“任务”要使用同一个线程池完成。我想测量执行每项任务所需的时间,但为此我需要等待“任务”中的每项任务(抱歉含糊不清)完成。
当只有一项任务时,我通常会这样做:
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/