我用一个ExecutorService
执行任务。该任务可以递归地创建提交给同一个任务的其他任务ExecutorService
这些子任务也可以做到这一点。
我现在遇到的问题是我想等到所有任务都完成(即所有任务都完成并且他们没有提交新任务)才继续。
我不能打电话ExecutorService.shutdown()
在主线程中,因为这会阻止新任务被接受ExecutorService
.
和呼唤ExecutorService.awaitTermination()
似乎什么也不做,如果shutdown
还没有被调用。
所以我有点被困在这里。对于ExecutorService
看到所有工人都闲着,可以吗?我能想到的唯一不优雅的解决方案是直接使用ThreadPoolExecutor
并查询其getPoolSize()
每过一段时间。真的没有更好的办法吗?
这确实是 Phaser 的理想选择。 Java 7 即将推出这个新类。它是一个灵活的 CountdonwLatch/CyclicBarrier。您可以在以下位置获取稳定版本JSR 166 兴趣站点 http://g.oswego.edu/dl/concurrency-interest/.
它是一种更灵活的 CountdownLatch/CyclicBarrier ,因为它不仅能够支持未知数量的参与方(线程),而且还可以重用(这就是阶段部分的用武之地)
对于您提交的每项任务,您都需要注册,当该任务完成后,您就到达了。这可以递归地完成。
Phaser phaser = new Phaser();
ExecutorService e = //
Runnable recursiveRunnable = new Runnable(){
public void run(){
//do work recursively if you have to
if(shouldBeRecursive){
phaser.register();
e.submit(recursiveRunnable);
}
phaser.arrive();
}
}
public void doWork(){
int phase = phaser.getPhase();
phaser.register();
e.submit(recursiveRunnable);
phaser.awaitAdvance(phase);
}
Edit:感谢@depthofreality在我之前的例子中指出了竞争条件。我正在更新它,以便执行线程仅等待当前阶段的提前,因为它会阻止递归函数完成。
相数不会跳闸,直到相数达到arrive
s == register
s。由于在每次递归调用之前调用register
当所有调用完成时,将发生阶段增量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)