Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
线程终止时的Java ExecutorService回调_Java_Multithreading_Threadpool_Executorservice - Fatal编程技术网

线程终止时的Java ExecutorService回调

线程终止时的Java ExecutorService回调,java,multithreading,threadpool,executorservice,Java,Multithreading,Threadpool,Executorservice,我正在使用缓存线程池执行器服务来运行一些异步后台任务。我提供了我的ThreadFactory,它向ExecutorService分发线程(无论何时需要)。我对缓存线程池的理解是,在线程空闲60秒后,ExecutorService终止它 我想在线程即将终止时执行一些状态清理。实现这一目标的最佳方式是什么?ExecutorService不容易为线程的生命周期提供挂钩 我不想关闭ExecutorService,这对于在任务到来时运行任务非常有用 ExecutorService executor = E

我正在使用缓存线程池执行器服务来运行一些异步后台任务。我提供了我的ThreadFactory,它向ExecutorService分发线程(无论何时需要)。我对缓存线程池的理解是,在线程空闲60秒后,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

线程工厂
代码中,创建
线程
的实例,这样它将
尝试
执行为其创建的
可运行
的工作,然后
最终
执行清理工作。像这样:

public Thread newThread(final Runnable r) {
    Thread t = new Thread() {
        public void run() {
            try {
                r.run();
            } finally {
                //do cleanup code
            }
        }
    };
    return t;
}

+一个有趣的问题。我想知道终结器是否能工作?@Rom1,有人在回复中建议实现
finalize
。我觉得他们把它删除了太糟糕了。需要注意的是,使用
finalize
意味着在GC和JVM中会产生一些性能问题。我尝试使用finalize方法,但没有成功。该方法未被调用。@Tim,当然,接受的答案看起来比干涉Finalizer要好得多。它或多或少类似于:另一种选择是使用固定大小的线程池,并且从不清理。释放的内存永远不会传递回操作系统,因此您可能会增加复杂性而没有任何好处。但是,如果需要清理的是数据库连接,您不能只是“从不清理”