¿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();
}
}
davy.ai
Como experto en TI especializado en Java, multihilo y ExecutorService, puedo proporcionar las siguientes respuestas:
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.