Tengo un código donde programo una tarea usando java.util.Timer
. Estaba mirando alrededor y vi que ExecutorService
podía hacer lo mismo. Entonces, esta pregunta aquí, ¿ha utilizado Timer
y ExecutorService
para programar tareas, cuál es el beneficio de usar una sobre otra?
También quería comprobar si alguien había usado la Timer
clase y se había encontrado con algún problema que los ExecutorService
resolvió.
Respuestas:
De acuerdo con la concurrencia de Java en la práctica :
Timer
puede ser sensible a los cambios en el reloj del sistema,ScheduledThreadPoolExecutor
no lo es.Timer
tiene un solo hilo de ejecución, por lo que la tarea de ejecución prolongada puede retrasar otras tareasScheduledThreadPoolExecutor
se puede configurar con cualquier cantidad de hilos. Además, tiene control total sobre los hilos creados, si lo desea (al proporcionarThreadFactory
).TimerTask
eliminan ese hilo, por lo queTimer
mueren :-( ... es decir, las tareas programadas ya no se ejecutarán.ScheduledThreadExecutor
No solo captura las excepciones de tiempo de ejecución, sino que le permite manejarlas si lo desea (anulando elafterExecute
método desdeThreadPoolExecutor
). La excepción lanzada se cancelará, pero otras tareas continuarán ejecutándose.Si puede usar en
ScheduledThreadExecutor
lugar deTimer
hacerlo, hágalo.Una cosa más ... si bien
ScheduledThreadExecutor
no está disponible en la biblioteca Java 1.4, hay un Backport de JSR 166 (java.util.concurrent
) para Java 1.2, 1.3, 1.4 , que tiene laScheduledThreadExecutor
clase.fuente
Si está disponible para usted, entonces es difícil pensar en una razón para no usar el marco de ejecución de Java 5. Vocación:
le dará una
ScheduledExecutorService
funcionalidad similar aTimer
(es decir, será de un solo subproceso) pero cuyo acceso puede ser un poco más escalable (bajo el capó, utiliza estructuras concurrentes en lugar de una sincronización completa como con laTimer
clase). El uso de aScheduledExecutorService
también le brinda ventajas tales como:newScheduledThreadPoolExecutor()
o laScheduledThreadPoolExecutor
clase)Las únicas razones por las que
Timer
puedo seguir son:fuente
TimerTask
puede ser la disponibilidad de unscheduledExecutionTime()
método que no parece tener ningún equivalenteScheduledExecutorService
.ExecutorService es más nuevo y más general. Un temporizador es solo un hilo que ejecuta periódicamente cosas que ha programado para él.
Un ExecutorService puede ser un grupo de subprocesos, o incluso extenderse a través de otros sistemas en un clúster y hacer cosas como la ejecución de lotes únicos, etc.
Solo mira lo que cada uno ofrece para decidir.
fuente
Aquí hay algunas buenas prácticas más sobre el uso del temporizador:
http://tech.puredanger.com/2008/09/22/timer-rules/
En general, usaría Timer para cosas rápidas y sucias y Executor para un uso más robusto.
fuente
Desde la página de documentación de Oracle en ScheduledThreadPoolExecutor
ExecutorService/ThreadPoolExecutor
oScheduledThreadPoolExecutor
es una opción obvia cuando tienes múltiples hilos de trabajo.Pros de
ExecutorService
másTimer
Timer
no puede aprovechar los núcleos de CPU disponibles, a diferencia deExecutorService
las tareas múltiples que utilizan saboresExecutorService
como ForkJoinPoolExecutorService
proporciona API colaborativa si necesita coordinación entre múltiples tareas. Suponga que tiene que enviar un número N de tareas de trabajador y esperar a que se completen todas. Puede lograrlo fácilmente con invokeAll API. Si desea lograr lo mismo con múltiplesTimer
tareas, no sería simple.ThreadPoolExecutor proporciona una mejor API para la gestión del ciclo de vida de Thread.
Pocas ventajas:
a. Puede crear / gestionar / controlar el ciclo de vida de los subprocesos y optimizar los gastos generales de creación de subprocesos
si. Puede controlar el procesamiento de tareas (Work Stealing, ForkJoinPool, invokeAll), etc.
C. Puedes monitorear el progreso y la salud de los hilos
re. Proporciona un mejor mecanismo de manejo de excepciones.
fuente
Mi razón para preferir a veces Timer en lugar de Executors.newSingleThreadScheduledExecutor () es que obtengo un código mucho más limpio cuando necesito que el temporizador se ejecute en hilos de demonio.
comparar
con
Hago esto cuando no necesito la solidez de un servicio de ejecución.
fuente