簡體   English   中英

wait() 總是拋出 InterruptedException

[英]wait() is always throwing InterruptedException

下面的wait()調用總是拋出InterruptedException 並不是其他線程正在中斷它。 在調用和拋出異常之間沒有延遲。 我已經放置了日志來檢查調用和捕獲異常之間的時間間隔。

此外, Thread.sleep(long)產生相同的結果。

public synchronized void retryConnection()
{
// . .. some code
    try
    {
        wait();
    }
    catch(InterruptedException e)
    {
        log(Level.SEVERE, "InterruptedException " , e);
    }
// . .. some code
}

我試過這些隨機的東西:

在新線程中調用此方法。 然后它工作正常。 它是一種等待和通知機制也有效。

再次放入相同的代碼,即捕獲異常后再次等待。 然后它正在等待。

觀察:當調用來自 netty(server) 線程時,它會失敗,但如果它來自某個其他 java 線程,則它可以工作。 所以我的問題是:是否有任何機制或線程狀態禁止wait()Thread.sleep()並在調用它們時拋出異常?

我檢查了中斷標志,它總是“假”。

InterruptedException是在使用Object.wait()thread.sleep()Object.notify()Object.notifyAll()時發生的完全正常的事件。

這稱為線程間通信

擁有對象監視器的線程可以調用Object.wait() - 該調用會導致當前線程失去監視器的所有權並等待/阻塞,直到擁有所述對象監視器的另一個線程調用Object.notify()Object.notifyAll()

這意味着擁有鎖的活動線程將其他線程從等待(或睡眠或阻塞)狀態喚醒。 在收到通知的線程可以繼續之前,這個發起線程還必須放棄對對象鎖的控制。

等待鎖的線程接收通知為InterruptedException 然后它可以繼續進行,因為在它收到異常時,它已經獲得了鎖的所有權。

有關詳細信息,請參閱Java 線程生命周期圖

所以在你的情況下:

  • 接收InterruptedException不是失敗。
  • Netty 試圖提高性能,不會讓線程等待太久,因此您不斷收到通知。
  • 當您運行線程時,您不會調用notify()notifyAll()並且永遠不會拋出異常
  • 對於Object.wait()Thread.sleep()你得到以下(來自 javaDoc):

    拋出此異常時清除當前線程的中斷狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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