gpt4 book ai didi

Java执行器服务: awaitTermination of all recursively created tasks

转载 作者:太空宇宙 更新时间:2023-11-04 11:42:39 25 4
gpt4 key购买 nike

我使用 ExecutorService 来执行任务。此任务可以递归地创建提交给同一个 ExecutorService 的其他任务,并且这些子任务也可以执行此操作。

我现在遇到的问题是我想等到所有任务都完成(即所有任务都完成并且他们没有提交新任务)才继续。

我无法在主线程中调用 ExecutorService.shutdown(),因为这会阻止 ExecutorService 接受新任务。

如果尚未调用 shutdown,则调用 ExecutorService.awaitTermination() 似乎不会执行任何操作。

所以我有点被困在这里了。对于 ExecutorService 来说,看到所有工作线程都处于空闲状态并不是那么困难,不是吗?我能想到的唯一不优雅的解决方案是直接使用 ThreadPoolExecutor 并每隔一段时间查询它的 getPoolSize() 。真的没有更好的办法吗?

最佳答案

这确实是 Phaser 的理想候选者。 Java 7 即将推出这个新类。它是一个灵活的 CountdonwLatch/CyclicBarrier。您可以通过 JSR 166 Interest Site 获取稳定版本。

它是更灵活的 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);
}

编辑:感谢@depthofreality在我之前的示例中指出了竞争条件。我正在更新它,以便执行线程仅等待当前阶段的前进,因为它会阻止递归函数完成。

直到到达数==注册数后,阶段数才会跳闸。由于在每次递归调用调用 register 之前,所有调用完成时都会发生阶段增量。

关于Java执行器服务: awaitTermination of all recursively created tasks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42634725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com