una not método hora example especifica ejecutar create como cancel java timer

not - timer java 8



La clase Java Timer dice "Las tareas del temporizador deben completarse rápidamente", ¿cómo definimos rápidamente? (7)

Estoy planeando usar esto para sondear una base de datos que puede tomar cerca de 10-15 minutos o más, así que debería usar temporizadores para esto.


El temporizador TAREA debe ejecutarse rápidamente, el intervalo de sondeo es irrelevante para su uso. Asegúrate de no confundir a los dos.


En este contexto, significa que debe haber completado su trabajo hasta que ocurra el próximo evento del temporizador porque, de lo contrario, el próximo evento no se procesará. Como la clase de temporizador es global, nunca puede estar seguro de quién más la está utilizando (por ejemplo, su controlador de base de datos podría estar utilizándola para implementar los tiempos de espera).

Si tiene que hacer un trabajo prolongado, use el temporizador para "iniciar" otro hilo (agregue un elemento a una cola de trabajo o inicie un segundo hilo en el controlador de eventos del temporizador). Esto liberará rápidamente el temporizador para el próximo evento.


La respuesta es, depende. Si solo va a ejecutar esta única tarea de sondeo, y el intervalo es más que suficiente para que cada ejecución termine antes de que comience la siguiente, entonces estas soluciones funcionarán bien.

El problema es cuando hay más de un TimeTask en el mismo temporizador, ya que se ejecutan secuencialmente en el mismo subproceso. Por lo tanto, una tarea de ejecución prolongada provocaría que las otras tareas esperaran durante largos periodos de tiempo, lo que frustra el propósito de crear tareas temporizadas.

Hay mejores soluciones para el escenario más complejo en el paquete java.util.concurrent, así como en otras bibliotecas como Quartz.


Si desea que la tarea se complete rápidamente, pero lo que necesita hacer en realidad lleva más tiempo, puede dividirla en dos partes. Tenga uno que se ejecute cuando el temporizador se dispare, para que las cosas sucedan en el momento correcto, pero luego difiera el procesamiento serio a otra función (por ejemplo, en un hilo diferente) que puede llevar todo el tiempo que necesite. Desde la API, el problema con las tareas de temporizador que tardan demasiado es que acaparan el hilo, posiblemente posponiendo las tareas posteriores, por lo que mover el proceso que consume mucho tiempo a otro subproceso debería evitar ese problema. Para responder a la pregunta en su título, "rápidamente" significaría que "debería terminar antes de que el temporizador tenga que disparar nuevamente".


Sin embargo, si genera un hilo para hacer el trabajo de la tarea del temporizador, tenga cuidado con la situación en la que el tiempo se dispara más rápidamente que los hilos completos, lo que provoca una carga de trabajo cada vez más degradante.


Supongo que hablas del java.util.Timer, no de los específicos de Swing.

Si mal no recuerdo, ese temporizador simplemente aplaza la ejecución a una única cadena de fondo que esencialmente sirve para cada instancia de temporizador en la JVM, por lo que el problema podría ser que un temporizador acapara esa cadena por cada otro temporizador.

Tan rápido dependería del resto de su aplicación y de si usa otros temporizadores.

En general, evito usarlo para algo serio, o simplemente lo hago engendrar un nuevo hilo.


java.util.concurrent.ScheduledThreadPoolExecutor es el "nuevo java.util.Timer ". Puede tener un número (un grupo) de hilos, por lo que puede acomodar tareas de larga ejecución. Aún así, es posible que desee considerar verificar que no se esté superponiendo demasiado.

Y, por supuesto, puede tener varios Timer y distribuir sus TimerTask adecuada.