2014-03-12 123 views
4

我想對線程中斷進行一些說明。java中的線程中斷

如果一個線程長時間不調用拋出anInterruptedException的方法會怎麼樣?然後它必須定期調用Thread.interrupted,如果接收到中斷,則返回true。例如:

for (int i = 0; i < inputs.length; i++) { 
    heavyCrunch(inputs[i]); 
    if (Thread.interrupted()) { 
     // We've been interrupted: no more crunching. 
     return; 
    } 
} 

當我打電話Thread.interrupt()它會拋出異常中斷這樣的方法,爲什麼我需要做if (Thread.interrupted())我只會做

try { 
    for (int i = 0; i < inputs.length; i++) { 
     heavyCrunch(inputs[i]); 
     if (Thread.interrupted()) { 
      // We've been interrupted: no more crunching. 
      return; 
     } 
    } 
} catch (InterruptedException ex) { 
     ... 
} 
+0

你可以使用布爾標誌來控制你的線程而不是Thread.interrupted()。這是更安全更清潔的解決方案 – hoaz

+0

'interrupt()'是一個實例方法,而不是一個靜態方法,所以它必須在線程實例上顯式調用。 – superEb

回答

4

當你在另一個線程調用Thread.interrupt(),發生兩件事情:

  1. 該線程的中斷標誌置位。
  2. 如果線程被阻塞的方法是throws InterruptedException,那麼該方法會立即拋出異常。

如果線程忙於一些代碼,不會InterruptedException,你不會得到任何的異常。這就是爲什麼你需要檢查if (Thread.interrupted()),檢查國旗。

在您的示例代碼中,Java編譯器會抱怨無效的catch塊,因爲try塊中的代碼都不會引發InterruptedException

0

因爲Thread.interrupted()as documented,不會拋出InterruptedException在所有。它返回true或false,並清除由Thread.interrupt()調用設置的中斷狀態。請注意,Thread.interrupt()不會導致InterruptedException被拋出。它只是簡單地設置中斷狀態。

+0

OP提到調用Thread.interrupt() –

+0

但Thread.interrupt()不會引發異常。它只是在線程上設置中斷狀態。 –

+0

在某些情況下,例如它正在等待/阻止它拋出InterruptedException –

0

對線程的調用中斷不會直接導致線程拋出InterruptedException。它所做的就是爲該線程設置中斷標誌。睡眠,等待或連接等方法可以在當前線程中引用該標誌,以決定是否拋出InterruptedException。

中斷是合作的,線程被中斷決定如何響應;通過這種方式,線程可以做任何需要清理的事情,而不會被中途擊中。

您通常應該使用Thread.isInterrupted(),因爲它不會更改中斷標誌的值。 Thread.interrupted()重置標誌:

線程的中斷狀態被此方法清除。換句話說,如果這個方法被連續調用兩次,那麼第二次調用將返回false(除非當前線程在第一次調用已經清除了其中斷的 狀態之後並且在第二次調用已經調試之前再次中斷了 它)。

Thread.isInterrupted()不會:這個線程

測試是否已經中斷。該線程的中斷狀態 不受此方法的影響。

檢查中斷標誌意味着你的線程可以檢測到它是否被中斷,而不必睡眠或等待。 Thread.isInterrupted()和Thread.interrupted()都不會引發InterruptedException,使用它的代碼將檢查返回值。

另外,Thread.interrupt不會拋出InterruptedException。 (並且拋出的任何異常將在調用線程中,而不是在被中斷的線程中)。中斷方法用於在另一個線程上設置中斷標誌。有一個線程中斷本身是毫無意義的,線程可以返回。