0

我使用Java的顯示器 - 捕捉InterruptedException的

java.util.concurrent.locks.Lock; 
java.util.concurrent.locks.ReentrantLock; 
java.util.concurrent.locks.Condition; 

,我是解決是讀/寫器問題的問題監視器的Java實現。我有一個鎖lock &兩個條件readerswriters

我注意到Condition.await()函數會拋出InterruptedException。現在,我剛剛用try/catch塊包圍了這個方法。但是,catch塊是空的。

我想知道什麼時候拋出這個異常,我該如何處理它。

readers.await()在有寫入者寫入文件/有寫入者等待寫入文件時被調用。

writers.await()當有一個或多個閱讀器從文件讀取或正在寫入文件的作者正在調用時。

在什麼情況下會拋出InterruptedException,我該如何處理它們?

+0

這篇文章可以幫助你瞭解這種機制:[你幹什麼用InterruptedException?](http://www.yegor256.com/2015/10/20/interrupted-exception.html) – yegor256

回答

0

中斷允許在線程上下文中停止一些長/阻塞任務。 InterruptedException僅在某人爲給定線程設置了「被中斷」標誌時纔會發生。

現在關於await()。當線程A正在等待Condition.await()時,通常這意味着它停靠在

LockSupport.park(Object blocker); ( - > sun.misc.Unsafe.park(boolean bln,long l)for Hotspot)。類似這樣的:

public void await() throws InterruptedException { 
     if (Thread.interrupted()) { 
      throw new InterruptedException(); 
     } 

     while (still_waiting) { 
      LockSupport.park(this); 
      if (Thread.interrupted()) { 
       throw new InterruptedException(); 
      } 
     } 
    } 

現在讓我們假設用戶停止應用程序。主線程調用A.interrupt()來完成你的線程A. interrupt()在本地Thread.interrupt0()中實現。這個調用集被「中斷」了該線程的標誌,並將線程A取消停放,線程發現它被中斷並拋出InterruptedException。

它取決於系統要求如何捕獲InterruptedException。如果你的線程在循環中做了一些工作,你應該打破循環讓線程完成。此外,它是很好的做法,將「中斷」標誌背面爲當前線程,如果你剛剛趕上一個InterruptedException:

try { 
     ... 
     some.await(); 
    } 
    catch (InterruptedException e) { 
     // Restore the interrupted status 
     Thread.currentThread().interrupt(); 
    } 

老,但還是不錯的文章:http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html?ca=drs-