栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/413885.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号