2009-12-13 55 views
11

有效的Java(第275頁),有這樣的代碼段:爲什麼要捕獲InterruptedException來調用Thread.currentThread.interrupt()?

... 
for (int i = 0; i < concurrency; i++) { 
    executor.execute(new Runnable() { 
    public void run() { 
    ready.countDown(); 
    try { 
     start.await(); 
     action.run(); 
    } catch (InterruptedException e) { 
     Thread.currentThread().interrupt(); 
    } finally { 
     done.countDown(); 
    } 
    } 
} 
... 

什麼用捕獲中斷異常,只是爲了重新提高呢?爲什麼不讓它飛呢?

回答

15

簡單的答案是InterruptedException是一個檢查異常,它不在Runnable.run方法(或Executable.execute()方法)的簽名中。所以你必須抓住它。一旦你抓住它,呼叫Thread.interrupt()設置中斷標誌是建議做的事情......除非你真的打算壓扁中斷。

+1

假設您希望線程實際中斷。你可以捕捉併吞下異常,這將抑制線程中斷。 – 2009-12-13 08:26:09

+0

你的意思是它不在Runnable的簽名中。我會使用Callable來代替。另外 - 調用Thread.currentThread()。interrupt()不會拋出異常?那麼投擲它有什麼意義? – ripper234 2009-12-13 08:48:08

+0

我相信你的意思是'InterruptedException'是一個檢查的異常,不在'Runnable.run()'(而不是'Executor.execute')的簽名中。 – Tom 2009-12-13 08:51:13

0

有時你不能忽略異常,你必須抓住它。主要發生這種情況時,您會覆蓋無法根據其簽名丟棄InterruptedException的方法。例如,這種方法通常用於Runnable.run()的方法。

0

執行程序可以在任務被取消時中斷任務,但會清除任務之間的中斷標誌,以避免一個取消的任務中斷不相關的任務。

因此,如果實際上做了任何事情,那麼中斷當前線程將是危險的。

更簡單的方法是使用Callable或忽略中斷。

此外,捕獲並記錄try/catch塊中引發的任何錯誤或異常是一個好主意,否則異常/錯誤將被丟棄,並且程序可能失敗,但您不會知道它是或爲什麼。

相關問題