Java ExecutorService:所有递归创建的任务的awaitTermination

Java ExecutorService:所有递归创建的任务的awaitTermination,第1张

Java ExecutorService:所有递归创建的任务的awaitTermination

如果最初不清楚递归任务树中的任务数量,则最简单的方法可能是实现您自己的同步原语(某种“反信号量”),并在您的任务之间共享它。在提交每个任务之前,您需要增加一个值,当任务完成时,它会减少该值,然后等待直到该值为0。

将其实现为从任务中显式调用的单独原语,可以将此逻辑与线程池实现分离开来,并允许您将多个独立的递归任务树提交到同一池中。

像这样:

public class InverseSemaphore {    private int value = 0;    private Object lock = new Object();    public void beforeSubmit() {        synchronized(lock) { value++;        }    }    public void taskCompleted() {        synchronized(lock) { value--; if (value == 0) lock.notifyAll();        }    }    public void awaitCompletion() throws InterruptedException {        synchronized(lock) { while (value > 0) lock.wait();        }    }}

请注意,

taskCompleted()
应在
finally
块内调用它,以使其不受可能的异常影响。

还要注意,

beforeSubmit()
应在任务提交之前由提交线程调用,而不是由任务本身调用,以避免在完成旧任务而尚未启动新任务时可能出现的“错误完成”。

编辑: 使用模式已修复的重要问题。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5031922.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-15
下一篇 2022-11-15

发表评论

登录后才能评论

评论列表(0条)

保存