2013-09-23 30 views
0

我必須使用線程池來運行線程。 我使用Spring框架的TaskExecutor類。 我使用FutureTask類,因爲我需要同步這些線程。 最後的代碼看起來像這樣的:我無法捕捉到FutureTask.get()方法的異常。 FutureTask是由Spring TaskExecutor發起的

private TaskExecutor taskExecutor; 

FutureTask futureTask=new FutureTask(new MyTask()); 
taskExecutor.execute(futureTask); 
try { 
    futureTask.get(); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} catch (ExecutionException e) { 
    e.printStackTrace(); 
} 

實際上,它可能發生執行MyTask線程被中斷。在調試模式下,我可以看到中斷標誌在MyTask的代碼中設置。但不幸的是,中斷異常沒有捕獲,我找不到原因。任何想法?

回答

0

我可以看到在MyTask的代碼中設置了中斷標誌。但不幸的是,中斷異常沒有捕獲,我找不到原因。任何想法?

,一個InterruptedException時引發的唯一時間是當該方法是做某種睡眠或等待(Thread.sleep(...)Object.wait(...)等)。在這種情況下,只有當調用futureTask.get()的線程被中斷時纔會拋出InterruptedException - 而不是任務本身。名爲get()的線程正在等待任務完成,因此可能會中斷。

如果您想檢查任務是否被中斷,那麼您應該在任務代碼中使用Thread.currentThread().isInterrupted()。您通常通過致電futureTask.cancel(true)中斷任務。如果它尚未執行,這將停止運行任務。如果它當前正在運行,則需要測試代碼中的中斷位。喜歡的東西:

// your task should do something like this if you have a while loop 
while (!Thread.currentThread().isInterrupted()) { 
    ... 
} 
+0

嗨格雷,現在很清楚。我認爲當創建的線程被中斷時,interrupedException被拋出。實際上,這是調用線程中斷的時候。非常感謝你 – user2807791

0

執行任務,包括InterruptedException異常會導致ExecutionException當(他們會被包裹在它),在此期間發生的任何異常。僅當運行futureTask.get()的線程中斷時,纔會拋出InterruptedException 。