Java ThreadPoolExecutors空闲线程关闭 - 调用自定义清理代码

时间:2014-08-03 12:33:35

标签: java multithreading threadpoolexecutor

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

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

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

1 个答案:

答案 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()方法返回后线程死亡)。