2013-04-09 86 views
4

我是新來的Java世界,如果它是愚蠢的問題,請耐心等待。什麼是檢查InterruptedException的好習慣?

我最近在Runnable對象的run()方法中看到了類似這樣的代碼。

try { 
    if (Thread.interrupted()) { 
     throw new InterruptedException(); 
    } 

    // do something 

    if (Thread.interrupted()) { 
     throw new InterruptedException(); 
    } 

    // do something 

    if (Thread.interrupted()) { 
     throw new InterruptedException(); 
    } 

    // and so on 

} catch (InterruptedException e){ 
    // Handle exception 
} finally { 
    // release resource 
} 

多久檢查一次線程中斷,應該在哪裏檢查線程中斷?

回答

5

它通常不是你只是灑在你的代碼中的東西。但是,如果您期望能夠取消異步任務,則可能需要定期檢查中斷。換句話說,當您識別需要更加響應中斷的代碼體時,通常會在之後添加

+0

謝謝,用戶可以點擊一個鍵,或點擊鼠標中斷點數?我只是想到其他情況:我們可以在長時間執行之前放置它,所以如果在線程進入該部分之前發生中斷,我們可以終止線程而不浪費我們的cpu或內存來做一些不再有效的事情。 – jAckOdE 2013-04-09 05:00:19

+0

@jAckOdE - 當某些代碼調用'thread.interrupt()'時,會發生中斷。 – jtahlborn 2013-04-09 12:11:31

3

我通常沒有看到正在使用的線程中斷機制 - 同樣,如果你的代碼沒有中斷線程,那麼線程不需要檢查它們是否被中斷。然而,如果你的程序正在使用的線程中斷機制,那麼的好地方放,如果(Thread.interrupted())檢查是在你的Runnable頂層循環:一個Runnable往往會看起來像

run() { 
    while(true) { 
     ... 
    } 
} 

此致反而會看起來像

run() { 
    try { 
     while(true) { 
      if(Thread.interrupted()) { 
       throw new InterruptedException(); 
      } 
      ... 
     } 
    } catch (InterruptedException ex) { 
     ... 
    } 
} 
+0

謝謝,對於包含無限循環的run()方法,我認爲這可能是標準模式。 – jAckOdE 2013-04-09 04:54:50

2

當有人調用其interrupt()方法的線程纔會被中斷。如果您從未撥打電子郵件interrupt(),並且您沒有與調用interrupt()的圖書館合作(並且您希望這些內容會被拼寫出來),那麼您無需檢查中斷。

有人想要想要中斷一個線程的主要原因是取消阻塞或長時間運行的任務。例如,鎖定機制wait()通常會導致線程永久等待通知,但另一個線程可能會中斷以強制等待線程停止等待(通常這將取消操作)。