亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

為什么總是在循環內調用wait()

為什么總是在循環內調用wait()

慕少森 2019-10-08 11:25:13
我讀過,我們應該始終wait()在循環內調用a :while (!condition) { obj.wait(); }它可以正常工作而沒有循環,那為什么呢?
查看完整描述

3 回答

?
蕪湖不蕪

TA貢獻1796條經驗 獲得超7個贊

您不僅需要循環它,還需要檢查循環中的條件。Java不能保證僅通過notify()/ notifyAll()調用或正確的notify()/ notifyAll()調用來喚醒您的線程。由于此屬性,無環版本可能在您的開發環境上工作,而在生產環境上意外失敗。


例如,您正在等待一些東西:


synchronized (theObjectYouAreWaitingOn) {

   while (!carryOn) {

      theObjectYouAreWaitingOn.wait();

   }

}

邪惡的線程出現了:


theObjectYouAreWaitingOn.notifyAll();

如果邪惡線程沒有/不能使carryOn您混亂,您只需繼續等待適當的客戶端。


編輯:添加了更多示例。等待可以中斷。它拋出InterruptedException,您可能需要將等待包裝在try-catch中。根據您的業務需求,您可以退出或取消該異常并繼續等待。


查看完整回答
反對 回復 2019-10-08
?
江戶川亂折騰

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)。


查看完整回答
反對 回復 2019-10-08
  • 3 回答
  • 0 關注
  • 616 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號