java - 在 Java 线程池中的每个工作线程上调用自定义关闭方法的优雅方法是什么?

标签 java threadpool executorservice

假设我正在使用

ExecutorService ex = Executors.newFixedThreadPool(nrofthreads);

启动一些工作并等待完成。

但是,我在工作线程中有相同的 Threadlocal 对象,批处理完成后需要关闭它们。 因此,我希望能够对线程池创建的所有工作线程调用自定义关闭方法。

最优雅的方式是什么?

现在我正在使用的黑客:

for(int i =0 ; i<20; i++){ //make sure to touch all threads with 20 runs..
   ex.execute(new Runnable(){
 public void run(){
   tearDownThreadLocals();
 }
   });
}  
ex.shutdown();

但这对我来说看起来并不是特别稳健;-)

谢谢 GJ

最佳答案

您可以使用Executors.newFixedThreadPool(int, ThreadFactory)通过 ThreadFactory ,像这样:

ExecutorService ex = Executors.newFixedThreadPool(nrofthreads, 
    new ThreadFactory() {
        public Thread newThread(final Runnable r) {
            return new Thread(new Runnable() {
                public void run() {
                    try {
                        r.run();
                    } finally {
                        tearDownThreadLocals();
                    }
                }
            });
        }
    });

编辑:刚刚注意到Executors已经有一个接受 ThreadFactory 的方法,所以不需要创建 ThreadPoolExecutor明确地。

关于java - 在 Java 线程池中的每个工作线程上调用自定义关闭方法的优雅方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2386096/

相关文章:

java - 文本未保存到字符串变量

java - InputStream 的自定义实现

java - Gradle:具有不同源和目标兼容性的多项目

java - 如何根据用户登录隐藏某些功能?

c++ - 在互斥量上使用多个 std::unique_lock,FIFO 中的所有线程都等待进程?

rust - 这是因为互斥量没有释放吗?

java - 使用 ScheduledThreadPool 并行执行

java - 在 Executors.withFixedSizePool 中创建固定大小的数据库连接

java - 线程池问题-收集文件