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)滿足,它就不會等待。
添加回答
舉報