[英]Are spurios wakeups accompanied by an InterruptedException?
Object.wait
的Javadoc提到,
與一個參數版本一樣,可能會產生中斷和虛假喚醒,並且此方法應始終在循環中使用。
synchronized (obj) {
while (<condition does not hold>) {
obj.wait(timeout, nanos);
}
... // Perform action appropriate to condition
}
它沒有提到需要在此處處理InterruptedException
。 這是否意味着wait方法可以自發地喚醒而不會拋出該方法。
我四處張望,但沒有發現有關喚醒實際處理方式的任何具體信息。
由於虛假中斷不是問題(或者我已經讀過),所以我相信情況就是如此。 我只是在尋找確認。
通常, obj.wait(...)
應該等待,直到有人調用obj.notify()
(或直到達到超時)為止,但是如文檔所述:
線程可以喚醒,而不會被通知,中斷或超時,即所謂的虛假喚醒。 盡管在實踐中這種情況很少發生,但是應用程序必須通過測試應該導致線程喚醒的條件來防范它,並在條件不滿足時繼續等待。 參見下面的例子
由於虛假喚醒 ,線程可能會在未通知的情況下喚醒。 這就是為什么必須循環檢查監視器的保護條件的原因(示例也取自javadoc):
synchronized (obj) {
while (<condition does not hold> and <timeout not exceeded>) {
long timeoutMillis = ... ; // recompute timeout values
int nanos = ... ;
obj.wait(timeoutMillis, nanos);
}
... // Perform action appropriate to condition or timeout
}
如果您使用的是超時,則應檢查是否也超過了超時時間。
這與處理中斷的異常無關。 那些不會被虛假地拋出,只有當當前線程確實被中斷時才拋出。 那就是在您的虛假循環中,您不需要為InterruptedException
添加處理
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.