我正在尋找以下問題的Java并發(fā)解決方案。有一些任務(wù)正在運行,還有一段代碼C。C必須等待所有任務(wù)完成。(超時)在C完成之前,無法開始任何任務(wù)。我瀏覽了java.concurrency包,發(fā)現(xiàn)了一些有趣的東西,但是似乎沒有什么工作很正確:移相器將允許一種方式阻塞,但不允許兩種方式。信號量,F(xiàn)orkJoinTasks和其他具有計數(shù)器類型的功能,但似乎都沒有我想要的功能。我相信我可以使用移相器和鎖來構(gòu)造一些東西,如下所示: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() );}現(xiàn)在,盡管我相當確定這是可行的,但我也知道嘗試構(gòu)建自己的并發(fā)解決方案是一個壞主意。有更好的方法嗎?如果沒有,我將如何使用該phase參數(shù)?編輯:此問題是在涉及Web客戶端連接的項目中,因此任務(wù)無法預(yù)測地到達。但是,通過更仔細的設(shè)計可以避免這種情況。
2 回答

慕哥9229398
TA貢獻1877條經(jīng)驗 獲得超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類的關(guān)鍵是readLock()不是互斥的,而writeLock()是互斥的。它也支持超時,類似于常規(guī)的Lock。
添加回答
舉報
0/150
提交
取消