Tengo un código donde programo una tarea usando java.util.Timer. Estaba mirando alrededor y vi que ExecutorServicepodía hacer lo mismo. Entonces, esta pregunta aquí, ¿ha utilizado Timery ExecutorServicepara programar tareas, cuál es el beneficio de usar una sobre otra?
También quería comprobar si alguien había usado la Timerclase y se había encontrado con algún problema que los ExecutorServiceresolvió.

Respuestas:
De acuerdo con la concurrencia de Java en la práctica :
Timerpuede ser sensible a los cambios en el reloj del sistema,ScheduledThreadPoolExecutorno lo es.Timertiene un solo hilo de ejecución, por lo que la tarea de ejecución prolongada puede retrasar otras tareasScheduledThreadPoolExecutorse puede configurar con cualquier cantidad de hilos. Además, tiene control total sobre los hilos creados, si lo desea (al proporcionarThreadFactory).TimerTaskeliminan ese hilo, por lo queTimermueren :-( ... es decir, las tareas programadas ya no se ejecutarán.ScheduledThreadExecutorNo solo captura las excepciones de tiempo de ejecución, sino que le permite manejarlas si lo desea (anulando elafterExecutemétodo desdeThreadPoolExecutor). La excepción lanzada se cancelará, pero otras tareas continuarán ejecutándose.Si puede usar en
ScheduledThreadExecutorlugar deTimerhacerlo, hágalo.Una cosa más ... si bien
ScheduledThreadExecutorno 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 laScheduledThreadExecutorclase.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
ScheduledExecutorServicefuncionalidad 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 laTimerclase). El uso de aScheduledExecutorServicetambién le brinda ventajas tales como:newScheduledThreadPoolExecutor()o laScheduledThreadPoolExecutorclase)Las únicas razones por las que
Timerpuedo seguir son:fuente
TimerTaskpuede 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/ThreadPoolExecutoroScheduledThreadPoolExecutores una opción obvia cuando tienes múltiples hilos de trabajo.Pros de
ExecutorServicemásTimerTimerno puede aprovechar los núcleos de CPU disponibles, a diferencia deExecutorServicelas tareas múltiples que utilizan saboresExecutorServicecomo ForkJoinPoolExecutorServiceproporciona 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últiplesTimertareas, 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