只有在提交给线程池的所有任务完成后,我才想从我的executeTasks()
方法返回。请注意,我的线程池具有可配置的threadpoolsize,并使用SynchronousQueue
作为后备队列,因此只有在线程可用时,我的for循环才能通过提交任务来安全地进行。所以,我只想等待最后的任务。我正在使用Phaser
。使用Phaser等待线程池任务完成
我创建了一个Phaser,其中包含1个注册方,即当前线程,并且我在向线程池提交任务之前向Phaser注册新方,当任务完成时,我注销任务方。当通过提交最终任务完成循环时,我希望我的arriveAndAwaitAdvance()
将等待注册方到达,但它只会发现所有这些方都在一段时间后被注销,然后向前移动并从我的方法返回。
我认为这会解决我的问题。请让我知道,如果我错了,或者是否有其他更好的方法来做到这一点。 Countdownlatch不会帮助我的threadpoolsize是可配置的。我知道有一个柜台和显示器可以解决这个问题,但我想要像Phaser这样的开箱即用的解决方案。
private void executeTasks(TheadPoolExecutor threadPool, Iterator<String> it) {
final Phaser phaser = new Phaser(1);
for (final String id : IteratorUtils.iterable(it)) {
phaser.register();
threadPool.execute(() -> {
// phaser.arrive();
try {
thread.sleep(10000 * id.length());
} finally {
phaser.arriveAndDeregister();
}
});
}
phaser.arriveAndAwaitAdvance();
phaser.arriveAndDeregister();
}
'invokeAll()'不适合你吗? – Calculator
不,我不想排队等待被调用的任务 – theeminence
我实现了这个,并且这个工作。如果有人发现任何漏洞或更好的方式,请让我知道。 – theeminence