我有一系列不同的“任务”需要使用相同的线程池完成。我想测量执行每个任务所需的时间,但为此我需要等待“任务”中的每个任务完成。(抱歉,由于不够明确,可能会引起歧义。)
当只有一个任务时,我通常会这样做:
我曾考虑关闭池,然后使用
我还想到最自然的做法是使用
是否有任何方法可以坚持使用
当只有一个任务时,我通常会这样做:
ExecutorService e = Executors.newCachedThreadPool();
for (int i=0; i<100; ++i)
e.submit(target);
e.shutdown();
while (!e.isTerminated());
由于将多个任务提交到池中,我无法将其关闭。所有与等待任务完成有关的方法都提到了“关闭请求后”。那么,如果我不想关闭它,而是要等待所有线程完成,然后再提交更多任务怎么办?
这就是我想要做的:
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
并等待所有任务完成?
CountDownLatch
并在主线程中等待它了吗? - omu_negruCountDownLatch
无法被重置。那么,在我描述的特定情况下使用这个类有什么意义呢?我可以随时声明新的CountDownLatch
对象,但那有点丑陋... - dabadabaCyclicBarrier
的优点在于您可以将Runnable
附加到它上面,然后处理所有从已完成任务中收集到的数据。您只需要创建它一次,然后将其作为引用传递给构造函数,因此对代码的修改最小化。 - omu_negru