第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

鎖存不同的任務(wù)類型

鎖存不同的任務(wù)類型

喵喵時光機 2021-04-05 16:40:20
我正在尋找以下問題的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。


查看完整回答
反對 回復(fù) 2021-04-28
  • 2 回答
  • 0 關(guān)注
  • 185 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號