not example ejemplo create cancel java timer scheduled-tasks scheduling executorservice

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

  1. Timer no puede aprovechar los núcleos de CPU disponibles, a diferencia de ExecutorService especialmente con múltiples tareas que utilizan sabores de ExecutorService como ForkJoinPool
  2. 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 del Timer , no sería sencillo.
  3. 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 (proporcionando ThreadFactory ).
  • Las excepciones de tiempo de ejecución lanzadas en TimerTask ese hilo, lo que hace que Timer TimerTask :-( ... es decir, las tareas programadas no se ejecutarán más. ThreadPoolExecutor ). La tarea que ThreadPoolExecutor 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 clase ScheduledThreadPoolExecutor )
  • 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)