Каков элегантный способ вызова пользовательского метода close для каждого рабочего потока в пуле потоков Java? - PullRequest
2 голосов
/ 05 марта 2010

говорят, что я использую

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 Ответ

4 голосов
/ 05 марта 2010

Вы можете использовать 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();
                    }
                }
            });
        }
    });

EDIT: Только что заметил, что Executors уже имеет метод, который принимаетThreadFactory, поэтому нет необходимости создавать ThreadPoolExecutor явно.

...