2012-01-12 21 views
1

,如果我有一個線程是這樣的:中斷線程在Java中的上吊過程

Thread t = new Thread(myThread); 
t.start(); 

private static Runnable myThread = new Runnable() { 
    public void run() { 
     try{ 
      String line=null; 
      while ((line = eStream.readLine()) != null){ 
       //do something 
      } 
     } 
     catch (Exception e){} 
    } 
}; 

現在while循環,在次readLine()掛,因爲它是從外部進程預計輸入會發生什麼英寸因此,在這種情況下,我所試圖做的是設置一個計時器,如果它過期,我interrupt this thread tt.interrupt();

現在,當我嘗試try塊後趕上InterruptedException,我得到編譯時錯誤。在這種情況下,有人能告訴我,我怎麼能捕獲中斷異常?

謝謝

+1

你能顯示導致編譯時錯誤的代碼嗎? – marchaos 2012-01-12 15:37:26

+0

@marchaos實際上錯誤消息表示InterruptedException的Unreachable catch塊。這個異常不會從try語句體中拋出。所以我很困惑在代碼中,我必須趕上這個異常 – Johnydep 2012-01-12 15:39:58

+0

我的不好,我有遺漏import java.io.InterruptedException; ,我想我無法趕上這個例外。 – Johnydep 2012-01-13 11:22:42

回答

2

中斷不會釋放阻塞的readLine()調用。您必須關閉流才能執行此操作。

您已經捕捉InterruptedException的(和忽略它),這條線

catch (Exception e){} 

這將無法正常工作

line = eStream.readLine().toString() 

因爲它會拋出一個NullPointerException當你到達文件的結尾。取下.toString()

+0

所以我可以通過聲明它是靜態的從另一個線程關閉流?但是,如果你看到我的評論上面爲我的理解,我想知道我在哪裏必須趕上這個異常,因爲Eclipse IDE給出了這條消息,如上面我的評論中所示,謝謝 – Johnydep 2012-01-12 15:42:24

+0

就像我說的,你已經抓住了它。 – 2012-01-12 15:44:13

+0

您不必將流設置爲靜態,您可以在將它傳遞給Runnable之前對其進行定義,也可以將Runnable設置爲具有close()方法的類型。 – 2012-01-12 15:49:24

2

從DOC爲InterruptedException:當一個線程在等待睡眠停了 時間長,使用中斷的方式 在Thread類是另一個線程中斷

拋出,或以其他方式。

我懷疑你感興趣的是InterruptedIOException:即一個I/O操作已中斷

信號。一個 InterruptedIOException被拋出,表示輸入或輸出 傳輸已終止,因爲執行它的線程被中斷了 。

我會在乾淨shuttin gdown線程檢查this JavaSpecialists newsletter,特別是第什麼擋在IO線程?其中詳細介紹了該區域。

+0

非常感謝,非常有趣的文章閱讀。我會試試這個InterruptedIOException,看看它是否適用於我 – Johnydep 2012-01-12 15:54:06