2011-05-02 105 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