2010-03-05 33 views
2

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

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

回答

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

+0

你想要把:try {r.run(); } finally {tearDownThreadLocals(); }以确保它始终被调用,无论运行如何? – Mike 2010-03-05 11:10:53

+0

@Mike:是的,很好的地方。 – axtavt 2010-03-05 11:13:19