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.

¿Cuándo debo usar Executor en lugar de ExecutorService?

Estoy aprendiendo multi-threading y me encontré con este post en SO.

  • Executor simplemente ejecuta cosas que le damos.

  • ExecutorService agrega inicio, cierre y la capacidad de esperar y ver el estado de los trabajos que hemos enviado para su ejecución, todo sobre Executor (del cual extiende).

Aún estoy tratando de entender el uso de Executor y ExecutorService.
1. ¿En qué escenarios usaría Executor en lugar de ExecutorService? ¿Puedo usar ExecutorService en todos los casos?
2. ¿Hay alguna manera de agregar un shutdown explícito para el método execute de un Executor, o cuál es la práctica general en torno a eso?

El siguiente código donde uso Executor no se detiene. ¿Es esta la forma correcta de usar un Executor o me falta algo aquí? ¿Cómo puedo terminar el código correctamente? Soy consciente de que Executor no tiene un shutdown. ¿Esperar que este programa no termine es algo esperado?

import java.util.concurrent.*;

public class A {
    public static void main(String[] args) {
        Executor executor = Executors.newFixedThreadPool(3);
        executor.execute(() ->
                System.out.println("Clase Executor: " +
                        Thread.currentThread().getId() + ", Nombre: " +
                        Thread.currentThread().getName()));
    }
}

Si reemplazo lo anterior con ExecutorService y agrego un shutdown, el programa termina correctamente.

import java.util.concurrent.*;

public class A {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(3);
        executor.submit(() ->
                System.out.println("Clase ExecutorService: " +
                        Thread.currentThread().getId() + ", Nombre: " +
                        Thread.currentThread().getName()));
        executor.shutdown();
    }
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en Java, multihilo y ExecutorService, puedo proporcionar las siguientes respuestas:

    1. El escenario en el que se utilizaría Executor en lugar de ExecutorService es cuando tienes un caso de uso de un solo uso donde la ejecución del hilo no es crítica y no necesitas apagar explícitamente el executor. Alternativamente, si no tienes la intención de enviar más trabajos al executor, o el número de trabajos es pequeño, puedes utilizar Executor. Sin embargo, para escenarios más complejos donde necesitas controlar el ciclo de vida del hilo, esperar el resultado o gestionar un gran número de trabajos, sería preferible utilizar ExecutorService. Siempre puedes utilizar ExecutorService ya que extiende Executor, pero no utilizarías todas sus funcionalidades por completo.
    2. Como mencionaste, Executor no tiene un método de apagado. Si deseas implementar un apagado explícito, la práctica general es extender Executor e implementar el método de apagado manualmente. En cuanto al código que proporcionaste, el Executor es responsable de la gestión de los hilos y cuando ejecutas un trabajo, no se detendrá a menos que interrumpas el hilo de manera forzada. Por lo tanto, se espera que el programa no termine a menos que interrumpas el hilo manualmente.

    En conclusión, aunque Executor es útil para escenarios simples, ExecutorService proporciona un mejor control sobre el ciclo de vida del hilo, y debes utilizarlo en escenarios donde se requiere la gestión del ciclo de vida del hilo, el seguimiento del estado del trabajo y la recuperación del trabajo. Si necesitas tener un mayor control sobre el ExecutorService, siempre puedes crear uno manualmente y extenderlo.

Comments are closed.