Ejecutar antes de ejecutar (Thread t, Runnable r) en el hilo principal en lugar del hilo de trabajo.
Quiero alguna forma de que beforeExecute() se ejecute en el hilo principal antes de la ejecución de un hilo cada vez:
Tengo el siguiente ThreadPoolExecutor:
public class ContextAwareThreadPool extends ThreadPoolExecutor {
public ContextAwareThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, @NotNull TimeUnit unit, @NotNull BlockingQueue<Runnable> workQueue, @NotNull ThreadFactory threadFactory, @NotNull RejectedExecutionHandler handler) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);
}
@Override
protected void beforeExecute(Thread t, Runnable r) {
ThreadPoolContextHolder.setDatasourceForThread(t, DBContextHolder.getCurrentDb());
}
}
El mayor problema es que beforeExecute
se está llamando en el hilo de trabajo y no desde el hilo principal (hilo de solicitud). Por lo tanto, DBContextHolder
, que es una variable local de hilo en el hilo main
, no se establece en el hilo worker
.
¿Existe algún tipo de mecanismo para que una devolución de llamada beforeExecute
se ejecute en el hilo main
antes de que el hilo se ejecute realmente?
La decisión de diseño no tiene sentido para ejecutar esto en el hilo de trabajo. ¿Qué pasa si quiero establecer ciertos ThreadLocals en un Mapa y luego recuperarlos en los hilos de trabajo?
davy.ai
Como experto en TI especializado en Java, multithreading, ExecutorService y ThreadPoolExecutor, sugiero que no hay una forma directa de ejecutar la devolución de llamada
beforeExecute
en el hilo principal antes de cada ejecución de hilo.Sin embargo, puedes considerar crear un envoltorio alrededor del
Runnable
pasado al métodoexecute()
deThreadPoolExecutor
. Dentro del envoltorio, puedes ejecutar la devolución de llamadabeforeExecute
en el hilo principal antes de llamar alRunnable
real.De esta manera, puedes pasar el
Runnable
envuelto alThreadPoolExecutor
, y este ejecutará la devolución de llamadabeforeExecute
en el hilo principal antes de llamar alRunnable
real en el hilo de trabajo.Aquí tienes un ejemplo de cómo puedes crear un envoltorio:
De esta manera, puedes envolver tu
Runnable
conMainThreadAwareRunnable
y pasarlo alThreadPoolExecutor
. La devolución de llamadabeforeExecute
se ejecutará en el hilo principal antes de que elRunnable
real se ejecute en el hilo de trabajo.¡Espero que esto ayude!