Programmazione
Asp
Asp.NET
Java
Javascript
Php
Oracle

Svaghi
Ascolta Radio
Faccine
Libri
Links

Varie
Cerca nel sito...
Segnalazioni
Scrivimi


JAVA pianificare azione ad intervalli regolari

In molte situazioni reali si rivela necessario impostare un'azione che deve essere eseguita ad intervalli regolari di tempo. Ad esempio, in un programma di monitoraggio di un web server, può essere utile, insieme ad altre informazioni, sapere quanti utenti sono connessi in un dato momento. Questa notifica periodica non deve naturalmente bloccare l'applicazione principale ma deve svolgersi in background.
A partire dalla versione 1.3, Java mette a disposizione la classe java.util.Timer che permette l'esecuzione in background di un'operazione che può essere eventualmente ripetuta ad intervalli regolari. Il tutto si può fare con pochissime righe di codice.
Anzitutto, il processo in background deve estendere la classe TimerTask, in modo tale che il Timer possa "schedularlo" invocando il metodo schedule(timerTask, delay, period). L'ultimo parametro di questo metodo, in particolare, permette di impostare la lunghezza dell'intervallo fra due esecuzioni successive, espresso in millisecondi. Esistono altre segnature di questo metodo; si consultino le API della classe Timer per risolvere le proprie esigenze specifiche.
Concludiamo con una nota sul costruttore della classe Timer da utilizzare. Il costruttore
public Timer(boolean isDaemon)
è utile se si vuole che il thread del timer sia un daemon, cioè un thread che serve altri thread e muore se non ci sono thread principali in esecuzione. In altre parole, l'utilizzo del costruttore senza parametro permette di eseguire indefinitamente il processo in background, cosa che non accade utilizzando un daemon, che muore al termine del thread principale.


Ecco il codice esplicativo:

import java.util.GregorianCalendar; 
import java.util.TimeZone; 
import java.util.Calendar; 

/** 
 * Un semplice utilizzo della classe Timer 
 * per pianificare azioni in background ad 
 * intervalli regolari. 
 */ 
public class MyThread extends java.util.TimerTask { 
   
  public void run() { 
  // Contiene il processo da eseguire in background 
   
    GregorianCalendar calendar = 
      new GregorianCalendar(TimeZone.getTimeZone("GMT+2")); 
   
    System.out.println("*** Thread in background:"); 
    System.out.println(" ora: " + 
      calendar.get(Calendar.HOUR_OF_DAY)); 
    System.out.println(" min: " + 
      calendar.get(Calendar.MINUTE)); 
    System.out.println(" sec: " + 
      calendar.get(Calendar.SECOND)); 
    System.out.println(""); 
  } // run() 
   
  public static void main (String [] args) { 

    MyThread mt = new MyThread(); 
    java.util.Timer timer = new java.util.Timer(); 
    timer.schedule(mt,0,5000); 

    // Qui c'è il codice dell'applicazione principale 
    for (int i=0; i<60000; i++) { 
        System.out.print("..."); 
    } 
    System.out.println(""); 
    System.out.println("*** Fine thread principale ***"); 
  } // main(String [] args) 

} // class MyThread