Che cosa è un modo elegante per chiamare un primo metodo personalizzato per ogni lavoratore-thread in un pool di thread Java?
-
24-09-2019 - |
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
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