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

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

三線程通信與同步

三線程通信與同步

江戶川亂折騰 2021-09-29 17:29:38
背景:我有三個線程。ThreadA 負責向隊列中寫入元素,如果隊列已滿,則通知 ThreadC 從隊列中讀取元素。ThreadB 是另一個條件,如果隊列未滿,但時間超過 5 秒,則 Thread 通知 threadC 從隊列中取出元素,最后,ThreadC 通知 ThreadB 刷新其時間戳。import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class Main {    private Lock lock = new ReentrantLock();    private Condition conA = lock.newCondition();    private Condition conB = lock.newCondition();    private Condition conC = lock.newCondition();    ArrayBlockingQueue<Integer> readQueueA = new ArrayBlockingQueue<>(3);    public static void main(String[] args) {        Main main1 = new Main();        try {            ThreadA threadWrite = main1.new ThreadA();            Thread threadOut = new Thread(threadWrite);            threadOut.start();            ThreadB threadB = main1.new ThreadB();            Thread threadBB = new Thread(threadB);            threadBB.start();            ThreadC threadRead = main1.new ThreadC();            Thread threadIn = new Thread(threadRead);            threadIn.start();        } catch (Exception ex) {            ex.printStackTrace();        }    }但是,輸出不是我所期望的,為什么一開始ThreadB outPut TimeOut Zzz?我認為應該不輸出這個項目。因為ThreadA喚醒了ThreadC,下一步應該exec ThreadC并且Thread可以在短時間內(nèi)運行完成而不超過5s.誰能幫我解釋或修復它?感謝你!
查看完整描述

1 回答

?
侃侃無極

TA貢獻2051條經(jīng)驗 獲得超10個贊

以下是您發(fā)布的特定場景中發(fā)生的情況:A 啟動并運行 while 循環(huán),直到它向 C 發(fā)出信號并等待。然后C啟動等待,這里就出現(xiàn)了問題;A在C 開始等待之前發(fā)出信號,因此信號調(diào)用丟失,現(xiàn)在 A 和 C 都在等待。所以此時,控制臺上的內(nèi)容是


通知 C...

我是線程 C...


現(xiàn)在 B 啟動,并等待整整 5 秒,因為沒有其他線程可以向它發(fā)出信號。因此,conB.await(5, TimeUnit.SECONDS)返回 false,它打印Timeout Zzzzzzz:,然后向 C 發(fā)送信號。這就是為什么事情看起來亂七八糟的原因,一個信號只有在另一個線程已經(jīng)在等待時才有效!


要解決此問題,請嘗試更改


conC.await();

System.out.println("I'm thread C, and I wake up " + new Date());


if (readQueueA.size() < 3) {

    conC.await();

    System.out.println("I'm thread C, and I wake up " + new Date());

}

這樣,如果 C 等待的條件已經(jīng)滿足,它就不會等待。


查看完整回答
反對 回復 2021-09-29
  • 1 回答
  • 0 關注
  • 155 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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