3 回答

TA貢獻1796條經驗 獲得超7個贊
您不僅需要循環它,還需要檢查循環中的條件。Java不能保證僅通過notify()/ notifyAll()調用或正確的notify()/ notifyAll()調用來喚醒您的線程。由于此屬性,無環版本可能在您的開發環境上工作,而在生產環境上意外失敗。
例如,您正在等待一些東西:
synchronized (theObjectYouAreWaitingOn) {
while (!carryOn) {
theObjectYouAreWaitingOn.wait();
}
}
邪惡的線程出現了:
theObjectYouAreWaitingOn.notifyAll();
如果邪惡線程沒有/不能使carryOn您混亂,您只需繼續等待適當的客戶端。
編輯:添加了更多示例。等待可以中斷。它拋出InterruptedException,您可能需要將等待包裝在try-catch中。根據您的業務需求,您可以退出或取消該異常并繼續等待。

TA貢獻1851條經驗 獲得超5個贊
在Object.wait(long milis)的文檔中得到了答復
線程也可以喚醒,而不會被通知,中斷或超時,即所謂的虛假喚醒。盡管在實踐中這種情況很少發生,但是應用程序必須通過測試應該導致線程喚醒的條件來防范它,并在條件不滿足時繼續等待。換句話說,等待應該總是像這樣循環執行:
synchronized (obj) {
while (<condition does not hold>)
obj.wait(timeout);
... // Perform action appropriate to condition
}
(有關此主題的更多信息,請參閱Doug Lea的“ Java并行編程(第二版)”(Addison-Wesley,2000年)中的3.2.3節,或Joshua Bloch的“有效的Java編程語言指南”(Addison-衛斯理,2001)。
添加回答
舉報