我正在寻找以下问题的Java并发解决方案。
有一些任务正在运行,还有一段代码C。
C必须等待所有任务完成。(超时)
在C完成之前,无法开始任何任务。
我浏览了java.concurrency包,发现了一些有趣的东西,但是似乎没有什么工作很正确:
移相器将允许一种方式阻塞,但不允许两种方式。
信号量,ForkJoinTasks和其他具有计数器类型的功能,但似乎都没有我想要的功能。
我相信我可以使用移相器和锁来构造一些东西,如下所示:
void C() {
synchronized(lock) {
phaser.awaitAdvanceInterruptibly(phase, 1, TimeUnit.SECONDS);
// Start work anyway if a task is taking too long.
doWork();
}
}
void someTask() {
synchronized(lock) {
phaser.register();
}
doTask().thenRun(
() -> phaser.arriveAndDeregister()
);
}
现在,尽管我相当确定这是可行的,但我也知道尝试构建自己的并发解决方案是一个坏主意。有更好的方法吗?
如果没有,我将如何使用该phase参数?
编辑:此问题是在涉及Web客户端连接的项目中,因此任务无法预测地到达。但是,通过更仔细的设计可以避免这种情况。
慕哥9229398
相关分类