Che cosa è un modo elegante per chiamare un primo metodo personalizzato per ogni lavoratore-thread in un pool di thread Java?

StackOverflow https://stackoverflow.com/questions/2386096

Domanda

dire che sto usando un

ExecutorService ex = Executors.newFixedThreadPool(nrofthreads);

girare un po 'di lavoro e in attesa quando è fatto.

Tuttavia devo stessi oggetti ThreadLocal nei worker-threads che devono essere chiuse quando il lotto è fatto. Pertanto, mi piacerebbe essere in grado di chiamare un primo metodo personalizzato su tutti i lavoratori-thread creati dal ThreadPool.

Quale sarebbe il modo più elegante per farlo?

In questo momento come un hack sto usando:

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();

, ma che non ha un aspetto particolarmente robusto per me ;-)

Grazie GJ

È stato utile?

Soluzione

È possibile utilizzare Executors.newFixedThreadPool(int, ThreadFactory) per passare un ThreadFactory, qualcosa di simile:

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:. appena notato che Executors ha già un metodo che accetta un ThreadFactory, quindi non c'è bisogno di creare ThreadPoolExecutor esplicitamente

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top