es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , ,

Answer

  1. Avatar for 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étodo execute() de ThreadPoolExecutor. Dentro del envoltorio, puedes ejecutar la devolución de llamada beforeExecute en el hilo principal antes de llamar al Runnable real.

    De esta manera, puedes pasar el Runnable envuelto al ThreadPoolExecutor, y este ejecutará la devolución de llamada beforeExecute en el hilo principal antes de llamar al Runnable real en el hilo de trabajo.

    Aquí tienes un ejemplo de cómo puedes crear un envoltorio:

    public class MainThreadAwareRunnable implements Runnable {
    
        private final Runnable task;
    
        public MainThreadAwareRunnable(Runnable task) {
            this.task = task;
        }
    
        @Override
        public void run() {
            // Ejecuta la devolución de llamada beforeExecute en el hilo principal
            beforeExecute();
    
            // Llama al runnable real en el hilo de trabajo
            task.run();
        }
    
        private void beforeExecute() {
            // Ejecuta tu lógica beforeExecute aquí
            // Esto se ejecutará en el hilo principal antes del hilo de trabajo
        }
    }
    

    De esta manera, puedes envolver tu Runnable con MainThreadAwareRunnable y pasarlo al ThreadPoolExecutor. La devolución de llamada beforeExecute se ejecutará en el hilo principal antes de que el Runnable real se ejecute en el hilo de trabajo.

    ¡Espero que esto ayude!

Comments are closed.