Cuando debemos usar hilo de Java sobre Ejecutor?
-
11-09-2019 - |
Pregunta
Ejecutor parece una abstracción limpia. ¿Cuándo desea utilizar hilo directamente en lugar de confiar en el más robusto ejecutor?
Solución
Para darle un poco de historia, ejecutores solamente se añadieron como parte del estándar de Java en Java 1.5. Así que en cierto modo los ejecutores pueden ser vistos como una nueva abstracción mejor para hacer frente a tareas ejecutables.
Un poco de una simplificación excesiva que viene ... - Ejecutores son hilos hacen bien lo que los utilizan con preferencia
.Otros consejos
Yo uso del hilo cuando necesito algún tipo de procesamiento de mensajes basada en extracción. P.ej. Una cola es tomar () - en en un bucle en un hilo separado. Por ejemplo, en que se coloca una cola en un contexto caro -. Le dijo una conexión JDBC, conexiones de JMS, archivos de proceso desde un solo disco, etc.
Antes de entrar maldije, ¿tiene algún escenario?
Editar
Como otros han dicho, la interfaz (Executor
) ExecutorService
tiene más potencial, como se puede utilizar el Executors
para seleccionar un comportamiento: programada, priorizados, etc. caché en Java 5+ o una backport Juc para Java 1.4
El marco ejecutor tiene protección contra estrellado runnables y automáticamente volver a crear subprocesos de trabajo. Un inconveniente en mi opinión, que usted tiene que shutdown()
explícita y awaitTermination()
ellos antes de salir de su aplicación - que no es tan fácil en aplicaciones GUI.
Si utiliza colas acotadas es necesario especificar un RejectedExecutionHandler
o los nuevos runnables botados.
Es posible echar un vistazo a Brian Goetz et al: Java concurrencia en la práctica (2006)
No hay ninguna ventaja de utilizar hilos primas. Siempre se puede suministrar Agentes ejecutivos con una fábrica de hilos, por lo que incluso la opción de creación de hilos preferidos está cubierto.
Usted no usa hilo a menos que necesite un comportamiento más específico que no se encuentra en el mismo hilo. A continuación, extender rosca y agregue su comportamiento específicamente querido.
Otras ventas sólo tiene que utilizar Ejecutable o ejecutor.
Bueno, pensé que un ThreadPoolExecutor proporciona un mejor rendimiento para que gestiona un grupo de subprocesos, lo que minimiza la sobrecarga de crear instancias de un nuevo hilo, la asignación de memoria ...
Y si se va a lanzar miles de hilos, que le da una cierta funcionalidad de gestión de colas que tendría que programar por su cuenta ...
Hilos y ejecutores son herramientas diferentes, utilizado en diferentes escenarios ... Como yo lo veo, es como preguntar por qué debería utilizar ArrayList cuando puedo usar HashMap? Son diferentes ...
paquete java.util.concurrent proporciona una interfaz ejecutor y se puede utilizar para hilo creado.
La interfaz Ejecutor proporciona un método único, ejecutar, diseñado para ser un reemplazo drop-in para un lenguaje de hilo creación común. Si r es un objeto ejecutable, y e es un objeto Ejecutor puede reemplazar
(nuevo hilo (r)) start ();.
con
e.execute (r);
Consulte aquí
Siempre es mejor preferir Ejecutor a Thread
incluso para un solo hilo como a continuación
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(1);
Puede utilizar Thread
sobre Executor
en escenarios siguientes
-
Su aplicación necesita hilo (s) limitada y la lógica de negocio es simple
-
Si sencillo modelo multi-threading abastece sus necesidades sin rosca Pool
-
se tiene la certeza de gestionar escenarios de hilo (s) del ciclo de vida + manejo de excepciones con ayuda de las API de bajo nivel en las áreas siguientes:
Inter thread communication, Exception handling, reincarnation of threads
debido a errores inesperados
y un último punto
-
Si su aplicación no necesita personalización de diversas características de
ThreadPoolExecutor
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
En todos los demás casos, se puede ir por ThreadPoolExecutor