¿Cuándo deberíamos usar Thread over Executor de Java?

El ejecutor parece una abstracción limpia. ¿Cuándo quieres utilizar Thread directamente en lugar de confiar en el ejecutor más robusto?

Para dar un poco de historia, los ejecutores solo se agregaron como parte del estándar java en Java 1.5. Entonces, en cierto modo, los ejecutores pueden verse como una nueva abstracción mejor para tratar con tareas ejecutables.

Un poco de una simplificación excesiva … – Los ejecutores son hilos hechos bien así que úselos con preferencia.

Uso Thread cuando necesito algún procesamiento de mensajes basado en extracción. Por ejemplo, una cola es take () – en en un bucle en un hilo separado. Por ejemplo, envuelve una cola en un contexto costoso, digamos una conexión JDBC, conexión JMS, archivos para procesar desde un solo disco, etc.

Antes de que me maldigan, ¿tienes algún escenario?

Editar :

Según lo manifestado por otros, la interfaz Executor ( ExecutorService ) tiene más potencial, ya que puede usar los Executors para seleccionar un comportamiento: progtwigdo, priorizado, en caché, etc. en Java 5+ o un backport juc para Java 1.4.

El marco ejecutor tiene protección contra ejecutables bloqueados y vuelve a crear automáticamente subprocesos de trabajo. Una desventaja, en mi opinión, es que tiene que shutdown() explícitamente shutdown() y awaitTermination() antes de salir de la aplicación, lo que no es tan fácil en las aplicaciones de la GUI. Si usa colas limitadas, necesita especificar un RejectedExecutionHandler o los nuevos ejecutables se descartarán.

Puede echarle un vistazo a Brian Goetz y otros: Java Concurrency in Practice (2006)

No hay ninguna ventaja al usar hilos sin procesar. Siempre puede proporcionarles a los ejecutores una fábrica de subprocesos, por lo que incluso la opción de creación de subprocesos personalizados está cubierta.

No usas Thread a menos que necesites un comportamiento más específico que no se encuentre en Thread. Luego extiendes el hilo y agregas tu comportamiento específicamente deseado.

De lo contrario, solo use Runnable o Executor.

Bueno, pensé que un ThreadPoolExecutor proporcionaba un mejor rendimiento porque gestionaba un conjunto de hilos, minimizando la sobrecarga de instanciar un nuevo hilo, asignando memoria …

Y si va a lanzar miles de subprocesos, le da algunas funciones de cola que debería progtwigr usted mismo …

Los hilos y los ejecutores son herramientas diferentes, utilizadas en diferentes escenarios … A mi modo de ver, es como preguntar por qué debería usar ArrayList cuando puedo usar HashMap? Ellos son diferentes…

El paquete java.util.concurrent proporciona la interfaz del ejecutor y se puede usar para crear el hilo.

La interfaz Executor proporciona un único método, ejecutar, diseñado para ser un reemplazo directo para una expresión común de creación de hilo. Si r es un objeto Runnable, y e es un objeto Ejecutor que puede reemplazar

(nuevo Thread (r)). start ();

con

e.execute (r);

Consulte aquí

Siempre es mejor preferir Executor a Thread incluso para un solo hilo como se muestra a continuación

 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(1); 

Puede usar Thread over Executor en los escenarios siguientes

  1. Su aplicación necesita un hilo (s) limitado (s) y la lógica comercial es simple

  2. Si el modelo simple de multi-threading satisface su requerimiento sin Thread Pool

  3. Confía en la gestión de los subprocesos ciclo de vida + casos de manejo de excepciones con ayuda de API de bajo nivel en las siguientes áreas: Inter thread communication, Exception handling, reincarnation of threads debido a errores inesperados

y un último punto

  1. Si su aplicación no necesita personalización de varias características de ThreadPoolExecutor

     ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) 

En todos los demás casos, puede ThreadPoolExecutor por ThreadPoolExecutor