2011-07-12 16 views
5

¿Qué sucede en el siguiente caso?tareas programadas del temporizador de Java

Timer t = new Timer(); 
t.schedule(...); 
t = new Timer(); 

Específicamente, ¿qué ocurre con las tareas de las que he programado en el temporizador T después de que me he asignado una nueva instancia de temporizador a T?

Respuesta

7

No desaparecen. Cada objeto Timer está asociado a un proceso en segundo plano. Incluso cuando elimine todas las referencias a su Timer en su programa, el proceso en segundo plano continuará ejecutándose (mantiene su propia referencia al objeto). Debido a esto, el objeto no estará sujeto a la recolección de basura.

Consulte el official documentation para obtener más información.

correspondiente a cada objeto Timer es un único subproceso de fondo que se utiliza para ejecutar todas las tareas del temporizador, secuencialmente ... Después de la última referencia en vivo a un objeto Timer desaparece y todas las tareas pendientes han finalizado su ejecución, el subproceso de ejecución de tareas del temporizador finaliza con elegancia (y queda sujeto a la recolección de elementos no utilizados). Sin embargo, esto puede demorar arbitrariamente en ocurrir.

2

Se ejecutará sin ningún problema. Lo único es que si no podrá cancelar el primer temporizador (si realmente desea cancelarlo)

0

El API docs for Timer me hace pensar que perder una referencia al temporizador no lo afectará en absoluto. Parece que cualquier tarea programada definitivamente se ejecutará definitivamente. La instancia del temporizador no se puede guardar como basura y la aplicación no se puede apagar hasta que la última tarea programada con ese temporizador haya terminado de ejecutarse. Extracto de los documentos:

"Después de que la última referencia en vivo a un objeto Timer desaparece y todas las tareas pendientes han completado la ejecución, el subproceso de ejecución de tareas del temporizador finaliza correctamente (y queda sujeto a la recolección de elementos no utilizados). El hilo de ejecución de la tarea no se ejecuta como un hilo de daemon, por lo que es capaz de evitar que una aplicación finalice. Si un llamador desea terminar el hilo de ejecución de tareas de un temporizador rápidamente, el llamador debe invocar el temporizador cancelar el método ".

0

por ejemplo

private ScheduledExecutorService scheduler; 
private AccurateScheduledRunnable periodic; 
private ScheduledFuture<?> periodicMonitor; 
private int taskPeriod = 30; 
private SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); 
private SimpleDateFormat sdfHour = new SimpleDateFormat("HH"); 

. . .

scheduler = Executors.newSingleThreadScheduledExecutor(); 
      periodic = new AccurateScheduledRunnable() { 

       private final int ALLOWED_TARDINESS = 200; 
       private int countRun = 0; 
       private int countCalled = 0; 

       @Override 
       public void run() { 
        countCalled++; 
        if (this.getExecutionTime() < ALLOWED_TARDINESS) { 
         countRun++; 
         dateNext = new java.util.Date(); 
         dateLast = new java.util.Date(); 
         long tme = dateNext.getTime(); 
         tme += (taskPeriod * 60) * 1000; 
         dateNext.setTime(tme); 
         //System.out.println(""); 
         //System.out.println(""); 
         //System.out.println("Next Sheduled Time at : " + sdf.format(dateNext)); 
         //System.out.println("Periodic Cycle In : " + (countRun) + "/" + countCalled + " at " + sdf.format(dateLast)); 
         //ti.displayMessage(null, " Running Sheduled Task at " + sdf.format(new Date()), TrayIcon.MessageType.NONE); 
         distAppInfo(); 
        } 
       } 
      }; 
      periodicMonitor = scheduler.scheduleAtFixedRate(periodic, 0, taskPeriod, TimeUnit.MINUTES); 
      periodic.setThreadMonitor(periodicMonitor); 

e implementa Monitor que devuelve f.e. el tiempo restante hasta el siguiente Shedule

long she = periodicMonitor.getDelay(TimeUnit.SECONDS); 

y Monitor

abstract class AccurateScheduledRunnable implements Runnable { 

    private ScheduledFuture<?> thisThreadsMonitor; 

    public void setThreadMonitor(ScheduledFuture<?> monitor) { 
     this.thisThreadsMonitor = monitor; 
    } 

    protected long getExecutionTime() { 
     long delay = -1 * thisThreadsMonitor.getDelay(TimeUnit.MILLISECONDS); 
     return delay; 
    } 
} 
0

que dependerá de método que va a utilizar, que Timer.schedule (..). Si el temporizador está configurado para ejecutarse repetidamente, la asignación de una nueva instancia de Timer a t no causará la recolección de basura, ya que el hilo del temporizador permanecerá activo. Si configura el temporizador para una ejecución única, el objeto obtendrá basura recolectada ... al menos eso es lo que dice la documentación.

Cuestiones relacionadas