2011-09-07 92 views
2

我正在研究一個多線程應用程序 Java 5。當它執行時,它會啓動多個執行器服務,並且必須運行很長時間。我有一個監視器服務,用於檢查每個創建的執行程序的狀態。我已閱讀,執行人服務可能僅具有以下狀態:監控並重新啓動Executor服務和將來的任務?

  • 運行,
  • 關停和
  • 終止。

萬一有什麼奇怪的執行過程中發生的, 我有子類我自己 FutureTask類和重寫方法:

  • setException和,
  • 完成(任何異常像ExecutionException和 InterruptedException這裏謹慎)

我有一個Executor服務拋出ExecutionException(在我自己的FutureTask類中)的情況。 ExecutionException被捕獲並記錄,但我的執行者服務不再記錄任何東西。我的監視器服務正在輸出執行程序服務仍然存在。 也許這與我的FutureTask達到完成狀態有關?

  1. 什麼是最好的管理方式?
  2. 是否可以重新啓動執行程序服務?
  3. 它看起來像FutureTask狀態影響Executor服務,我可以使用FutureTask的狀態來知道Executor服務的狀態。

感謝您的幫助,

回答

1

通常處理異常最好由任務本身來完成。如果你的任務拋出一個異常,即使它的計劃任務完成(它不會再運行)。事實上,如果在任務完成之後您想完成任何工作,那麼通常也是由同一個線程完成的。即只有在幾乎沒有任何事情要做時纔會返回。

編輯:爲了防止臨死的重複任務,你可以使用try/catch塊。

Runnable run = new Runnable() { 
    public void run() { 
     try { 
      // do something which might throw an Exception 
     } catch(Exception e) { 
      log.error(e); 
     } 
    } 
}; 
scheduledExecutorService.scheduleAtFixedRate(run, delay, period, unit); 

如果不捕獲異常並記錄它,它會被存儲在FutureTask,你必須記得有記錄它,並重新啓動記住多久的侏儒,他任務的任務。

順便說一句:任務不會影響ExecutorService的狀態,除非有一個引用它直接調用它。 (它不會意外發生)

BTW2:隨着Java 7的發佈,在Java 6超過五年之後,它有時間考慮從Java 5.0移植過來,Java 5.0已經過了三年的壽命。

+0

感謝您的迴應和建議彼得。對於Java 5,我的意思是我使用新的執行器架構。我的Java版本是6.0。你完全正確地保持jvm最新的工作。我也解決了我的問題,它似乎工作:我在監視器中添加了一行以檢查futuretask的完成狀態,如果它是真的,那麼我將重新提交futuretask給執行程序。 – Alain

+0

@Alain,確保它不會首先死亡是相當簡單的。 ;) –