在Java线程池中为每个工作线程调用自定义close方法的优雅方法是什么?

时间:2010-03-05 10:47:33

标签: java threadpool executorservice

说我正在使用

ExecutorService ex = Executors.newFixedThreadPool(nrofthreads);

开始做一些工作并等待它完成。

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

最优雅的方法是什么?

现在作为我正在使用的黑客:

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

1 个答案:

答案 0 :(得分:4)

您可以使用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