我正在寻找以下问题的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客户端连接的项目中,因此任务无法预测地到达。但是,通过更仔细的设计可以避免这种情况。
2 回答
![?](http://img1.sycdn.imooc.com/533e4c2300012ab002200220-100-100.jpg)
慕哥9229398
TA贡献1877条经验 获得超6个赞
我在java.util.concurrent.locks中找到了解决此问题的解决方案,这对我的用例来说是完美的。
StampedLock lock;
void C() {
long stamp = lock.tryWriteLock(1, TimeUnit.SECONDS);
doWork();
lock.unlockWrite(stamp);
}
void someTask() {
long stamp = lock.readLock();
doTask().thenRun(() -> lock.unlockRead(stamp));
}
StampedLock类的关键是readLock()不是互斥的,而writeLock()是互斥的。它也支持超时,类似于常规的Lock。
添加回答
举报
0/150
提交
取消