根据ThreadPoolExecutor doc(Java ThreadPoolExecutor),如果我像这样创建一个执行器服务:
new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
当#threads> corePoolSize,空闲线程将被杀死。当ThreadPoolExecutor杀死任何线程时,我想调用一些特定于应用程序的清理代码。我无法明确这样做。感谢任何帮助。提前谢谢。
答案 0 :(得分:5)
正确的方法是在run()方法返回后扩展Thread并运行清理代码,如下所示:
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(50);
ThreadFactory threadFactory = new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return new Thread(r) {
@Override
public void run() {
super.run();
//DO YOUR CLEANUP HERE
}
};
}
};
new ThreadPoolExecutor(1, 10, 10, TimeUnit.SECONDS, workQueue, threadFactory);
在您的场景中几乎肯定不会调用中断,因为只有在关闭活动执行程序时才会调用它(即使这样,也不是总是)。
通过在运行之后直接调用cleanup,在线程终止之前调用清理代码(在runnable的run()方法返回后线程死亡)。