线程终止时的Java ExecutorService回调
我正在使用缓存的线程池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
在你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;
}
另一种选择是使用固定大小的线程池,并且永远不会清理。释放内存永远不会传回操作系统,所以您可能会增加复杂性而没有好处。 – 2011-05-02 22:15:33
但是如果需要清理的东西是数据库连接,那么您不能只是'永远不清理'。 – stu 2013-01-07 20:08:04
+1有趣的问题。我想知道终结者是否会起作用? – Rom1 2011-05-02 21:43:49
@ Rom1,有人曾在回复中建议实施'finalize'。我认为这太糟糕了,他们删除了它。应该指出的是,使用'finalize'意味着在GC和JVM中产生一些性能命中。 – 2011-05-02 23:04:54
我试图使用finalize方法,但它不起作用。该方法没有被调用。 – 2011-05-02 23:14:50