如果最初不清楚递归任务树中的任务数量,则最简单的方法可能是实现您自己的同步原语(某种“反信号量”),并在您的任务之间共享它。在提交每个任务之前,您需要增加一个值,当任务完成时,它会减少该值,然后等待直到该值为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()应在任务提交之前由提交线程调用,而不是由任务本身调用,以避免在完成旧任务而尚未启动新任务时可能出现的“错误完成”。
编辑: 使用模式已修复的重要问题。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)