ejemplo - timer java 8 example
Java Timer vs ExecutorService? (6)
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.
Tengo un código donde programo una tarea usando java.util.timer
. Estaba mirando alrededor y vi que ExecutorService
puede hacer lo mismo. Entonces, esta pregunta aquí, ¿ha usado 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 clase Timer
y se había encontrado con algún problema que el Servicio de ExecutorService
resolviera para ellos.
Desde la página de documentación de Oracle en ScheduledThreadPoolExecutor
Un ThreadPoolExecutor que adicionalmente puede programar comandos para que se ejecuten después de un retraso determinado o para que se ejecuten periódicamente. Esta clase es preferible a Temporizador cuando se necesitan múltiples subprocesos de trabajo, o cuando se requieren la flexibilidad o las capacidades adicionales de ThreadPoolExecutor (que se extiende esta clase).
ExecutorService/ThreadPoolExecutor
o ScheduledThreadPoolExecutor
es una opción obvia cuando tiene varios subprocesos de trabajo.
Pros de ExecutorService
over Timer
-
Timer
no puede aprovechar los núcleos de CPU disponibles, a diferencia deExecutorService
especialmente con múltiples tareas que utilizan sabores deExecutorService
como ForkJoinPool -
ExecutorService
proporciona una API colaborativa si necesita coordinación entre varias tareas. Supongamos que tiene que enviar N número de tareas de trabajo y esperar a que se completen todas. Puedes lograrlo fácilmente con invokeAll API. Si desea lograr lo mismo con varias tareas delTimer
, no sería sencillo. ThreadPoolExecutor proporciona una mejor API para la administración del ciclo de vida de Thread.
Los grupos de subprocesos resuelven dos problemas diferentes: generalmente proporcionan un rendimiento mejorado al ejecutar grandes cantidades de tareas asíncronas, debido a la reducción de la sobrecarga de invocación por tarea, y proporcionan un medio de delimitación y administración de los recursos, incluidos los subprocesos, que se consumen al ejecutar una recopilación de Tareas. Cada ThreadPoolExecutor también mantiene algunas estadísticas básicas, como el número de tareas completadas
Algunas ventajas:
a. Puede crear / administrar / controlar el ciclo de vida de los subprocesos y optimizar los gastos generales de creación de subprocesos
segundo. Puede controlar el procesamiento de tareas (Work Stealing, ForkJoinPool, invokeAll) etc.
do. Puedes monitorear el progreso y la salud de los hilos.
re. Proporciona un mejor mecanismo de manejo de excepciones.
ExecutorService es más nuevo y más general. Un temporizador es solo un hilo que periódicamente ejecuta cosas que ha programado para ello.
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 por lotes de una sola vez, etc.
Solo mira lo que cada uno ofrece para decidir.
Mi razón para a veces preferir Timer en lugar de Executors.newSingleThreadScheduledExecutor () es que obtengo un código mucho más limpio cuando necesito que el temporizador se ejecute en subprocesos de daemon.
comparar
private final ThreadFactory threadFactory = new ThreadFactory() {
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setDaemon(true);
return t;
}
};
private final ScheduledExecutorService timer = Executors.newSingleThreadScheduledExecutor(threadFactory);
con
private final Timer timer = new Timer(true);
Hago esto cuando no necesito la robustez de un servicio de ejecución.
Según Java Concurrency in Practice :
-
Timer
puede ser sensible a los cambios en el reloj del sistema,ScheduledThreadPoolExecutor
no lo es. -
Timer
solo tiene un hilo de ejecución, por lo que una tarea de larga ejecución puede retrasar otras tareas.ScheduledThreadPoolExecutor
se puede configurar con cualquier número de subprocesos. Además, tiene control total sobre los subprocesos creados, si lo desea (proporcionandoThreadFactory
). - Las excepciones de tiempo de ejecución lanzadas en
TimerTask
ese hilo, lo que hace queTimer
TimerTask
:-( ... es decir, las tareas programadas no se ejecutarán más.ThreadPoolExecutor
). La tarea queThreadPoolExecutor
la excepción se cancelará, pero otras tareas continuarán ejecutándose.
Si puede usar ScheduledThreadExecutor
lugar de Timer
, hágalo.
Una cosa más ... mientras que ScheduledThreadExecutor
no está disponible en la biblioteca Java 1.4, hay un Backport de JSR 166 ( java.util.concurrent
) a Java 1.2, 1.3, 1.4 , que tiene la clase ScheduledThreadExecutor
.
Si está disponible para usted, entonces es difícil pensar en una razón para no usar el framework ejecutor Java 5. Vocación:
ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();
le brindará un ScheduledExecutorService
con una funcionalidad similar a Timer
(es decir, será de un solo hilo) 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 la clase Timer
). El uso de un ScheduledExecutorService
también le brinda ventajas tales como:
- Puede personalizarlo si es necesario (consulte la
newScheduledThreadPoolExecutor()
o la claseScheduledThreadPoolExecutor
) - Las ejecuciones ''one off'' pueden dar resultados.
Sobre las únicas razones por las que me Timer
con Timer
son:
- Está disponible pre Java 5
- En J2ME se proporciona una clase similar, lo que podría facilitar la portabilidad de su aplicación (pero en este caso no sería muy difícil agregar una capa de abstracción común)