Java线程池执行器空闲线程关闭-调用自定义清理代码

Java线程池执行器空闲线程关闭-调用自定义清理代码,java,multithreading,threadpoolexecutor,Java,Multithreading,Threadpoolexecutor,根据ThreadPoolExecutor doc(),如果我像这样创建一个executor服务: new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); 当#threads>corePoolSize时,空闲线程将被终止。我想在ThreadPoolExecutor杀死任何线程时调用一些特定于应用程序的清理代码。我无法找到一个明确的方法来这样做。谢谢你的帮助。提前感谢。正确的方法是

根据ThreadPoolExecutor doc(),如果我像这样创建一个executor服务:

new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);

当#threads>corePoolSize时,空闲线程将被终止。我想在ThreadPoolExecutor杀死任何线程时调用一些特定于应用程序的清理代码。我无法找到一个明确的方法来这样做。谢谢你的帮助。提前感谢。

正确的方法是在run()方法返回后扩展线程并运行清理代码,如下所示:

    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);
BlockingQueue workQueue=newarrayblockingqueue(50);
ThreadFactory ThreadFactory=新的ThreadFactory(){
@凌驾
公共线程newThread(可运行的r){
返回新线程(r){
@凌驾
公开募捐{
super.run();
//你在这里打扫吗
}
};
}
};
新的ThreadPoolExecutor(1,10,10,TimeUnit.SECONDS,workQueue,threadFactory);
在您的场景中,中断几乎肯定不会被调用,因为它只会在关闭活动的执行器时被调用(即使如此,也不总是这样)


通过在运行后直接调用cleanup,在线程死亡之前(runnable的run()方法返回后,线程死亡)会调用清理代码。

您是否考虑过给执行者自己的ThreadFactory实现,这反过来会创建自己的“I was killed”-感知线程的实现?另请参见我刚才查看的实现,我认为覆盖
interrupt
以启动清理不是您想要的。当工作线程被“杀死”时,线程池只会放弃引用,而不必调用中断。反之亦然:当interupt被调用时,并不意味着线程被终止。我想你应该让你的ThreadFactory保留对它创建的线程的WeakReference,并将它们注册到ReferenceQueue中。在那里,当它们变得弱可及时(所有强引用都被放弃),它们被排队。这就是我要尝试的。也许有人有更好(更简单)的想法?我从来都不需要这个,这让我怀疑你有设计问题。好的答案只有一个缺点:如果你真的把代码拿出来运行,那么池中只有一个线程。这是由于您提供的ArrayBlockingQueue工作队列造成的。如果你改变它与SynchronousQueue一起工作,答案将是完美的!为什么会这样?这应该是另一个“stackoverflow”问题(如果还没有…)@shlomi33-