簡體   English   中英

spurios喚醒是否伴隨InterruptedException?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM