2011-05-02 107 views
13

我正在使用緩存的線程池ExecutorService來運行一些異步後臺任務。我提供了將線程交給ExecutorService的ThreadFactory(無論何時需要它們)。我對高速緩存線程池的理解是,在線程閒置60秒後,它由ExecutorService定義。線程終止時的Java ExecutorService回調

我想在我的線程即將終止時執行一些狀態清理。達到此目的的最佳方法是什麼? ExecutorService不會輕易在線程的生命週期中提供鉤子。

我不想關閉我的ExecutorService - 對於隨時運行任務很有用。

ExecutorService executor = Executors.newCachedThreadPool(new MyThreadFactory()); 

// Do some work 
executor.submit(new MyCallable()); 

// Need a way for the ExecutorService to notify me when it is about to 
// terminate my thread - need to perform some cleanup 

感謝,

Shreyas

+0

+1有趣的問題。我想知道終結者是否會起作用? – Rom1 2011-05-02 21:43:49

+0

@ Rom1,有人曾在回覆中建議實施'finalize'。我認爲這太糟糕了,他們刪除了它。應該指出的是,使用'finalize'意味着在GC和JVM中產生一些性能命中。 – 2011-05-02 23:04:54

+0

我試圖使用finalize方法,但它不起作用。該方法沒有被調用。 – 2011-05-02 23:14:50

回答

14

在你ThreadFactory代碼,創建實例Thread這樣它將try做爲其創建Runnable的工作,然後finally做你清理工作。像這樣:

public Thread newThread(final Runnable r) { 
    Thread t = new Thread() { 
     public void run() { 
      try { 
       r.run(); 
      } finally { 
       //do cleanup code 
      } 
     } 
    }; 
    return t; 
} 
+1

另一種選擇是使用固定大小的線程池,並且永遠不會清理。釋放內存永遠不會傳回操作系統,所以您可能會增加複雜性而沒有好處。 – 2011-05-02 22:15:33

+2

但是如果需要清理的東西是數據庫連接,那麼您不能只是'永遠不清理'。 – stu 2013-01-07 20:08:04