[英]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
。 然后它可以繼續進行,因為在它收到異常時,它已經獲得了鎖的所有權。
所以在你的情況下:
InterruptedException
不是失敗。notify()
或notifyAll()
並且永遠不會拋出異常Object.wait()
和Thread.sleep()
你得到以下(來自 javaDoc):
拋出此異常時清除當前線程的中斷狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.