2012-07-29 21 views
11

Ho una thread che si occupa di alcuni processi. Voglio fare in modo che questa elaborazione venga eseguita ogni 3 secondi. Ho usato il codice qui sotto, ma quando inizia il thread, non succede nulla. Ho assunto che quando definisco un'attività per il mio timer, esegue automaticamente il ScheduledTask entro un intervallo di tempo, ma non fa nulla. Cosa mi manca?Timer in Java Thread

class temperatureUp extends Thread 
{ 
    @Override 
    public void run() 
    { 
    TimerTask increaseTemperature = new TimerTask(){ 

     public void run() { 
     try { 
      //do the processing 
     } catch (InterruptedException ex) {} 
     } 
    }; 

    Timer increaserTimer = new Timer("MyTimer"); 
    increaserTimer.schedule(increaseTemperature, 3000); 

    } 
}; 
+1

http://www.ibm.com/developerworks/java/library/j-schedule/index.html – nullpotent

+0

Sei sicuro di creare un thread 'temperatureUp' e chiama' start() '? Questo codice funziona bene per me. –

+0

Perché dovresti usare sia una discussione che un timer? Il timer funziona sulla sua stessa thread –

risposta

1

Penso che il metodo che hai utilizzato abbia la firma schedule(TimerTask task, long delay). Quindi, in effetti, stai solo ritardando l'ora di inizio dell'esecuzione UNICA.

Per pianificare l'esecuzione ogni 3 secondi è necessario utilizzare questo metodo schedule(TimerTask task, long delay, long period) in cui il parametro terzo viene utilizzato per fornire l'intervallo di tempo.

è possibile fare riferimento alla definizione di classe Timer qui per essere di ulteriore aiuto

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Timer.html

+0

con la riga 'increaseerTimer.schedule (increaseTemperature, 2000, 2000);' ancora non succede niente! – Afflatus

+0

@Elham - Non l'avevo notato prima, ma stai generando un nuovo thread all'interno di un altro thread? Questo è un approccio molto sbagliato. Valuta la possibilità di modificare la struttura in modo che i thread vengano generati e pianificati da un livello globale. Ecco un link con un esempio di progetto che ti aiuterà a cambiare la struttura: http://www.roseindia.net/java/example/java/util/CertainAndRepeatTime.shtml – afrin216

+0

in altre parole, non posso usare Timer per programmare il serie di azioni che sono fatte da un thread. destra? – Afflatus

2

Al fine di fare qualcosa ogni tre secondi si dovrebbe usare scheduleAtFixedRate (vedi javadoc).

Tuttavia, il codice non fa davvero nulla perché si crea un thread in cui si avvia un timer poco prima che si interrompa la corsa del thread (non c'è altro da fare). Quando il timer (che è uno scatto singolo) si innesca, non c'è alcun thread da interrompere (esecuzione terminata prima).

class temperatureUp extends Thread 
{ 
    @Override 
    public void run() 
    { 
    TimerTask increaseTemperature = new TimerTask(){ 

     public void run() { 
     try { 
      //do the processing 
     } catch (InterruptedException ex) {} 
     } 
    }; 

    Timer increaserTimer = new Timer("MyTimer"); 
    //start a 3 seconds timer 10ms later 
    increaserTimer.scheduleAtFixedRate(increaseTemperature, 3000, 10); 

    while(true) { 
     //give it some time to see timer triggering 
     doSomethingMeaningful(); 
    } 
} 
15

Alcuni errori nel frammento di codice:

  • si estende la classe Thread, che non è davvero buona pratica
  • Hai un Timer all'interno di un Thread? Questo non ha senso dato che a Timer viene eseguito da solo Thread.

Si dovrebbe piuttosto (quando/se necessario), l'attuazione di una Runnable vedere here per un breve esempio, tuttavia non vedo la necessità sia per un Thread e Timer nel frammento hai dato.

Si veda l'esempio seguente di una Timer di lavoro che si limiterà a incrementare il contatore di uno ogni volta che viene chiamato (ogni 3 secondi):

import java.util.Timer; 
import java.util.TimerTask; 

public class Test { 

    static int counter = 0; 

    public static void main(String[] args) { 

     TimerTask timerTask = new TimerTask() { 

      @Override 
      public void run() { 
       System.out.println("TimerTask executing counter is: " + counter); 
       counter++;//increments the counter 
      } 
     }; 

     Timer timer = new Timer("MyTimer");//create a new Timer 

     timer.scheduleAtFixedRate(timerTask, 30, 3000);//this line starts the timer at the same time its executed 
    } 
} 

Addendum:

ho fatto una breve esempio di incorporazione di Thread nel mix. Così ora la TimerTask si limiterà a incrementare counter da 1 ogni 3 secondi, e il Thread visualizzerà counter s valore letto per 1 secondi ogni volta controlla contatore (che terminerà se stessa e il timer dopo counter==3):

import java.util.Timer; 
import java.util.TimerTask; 

public class Test { 

    static int counter = 0; 
    static Timer timer; 

    public static void main(String[] args) { 

     //create timer task to increment counter 
     TimerTask timerTask = new TimerTask() { 

      @Override 
      public void run() { 
       // System.out.println("TimerTask executing counter is: " + counter); 
       counter++; 
      } 
     }; 

     //create thread to print counter value 
     Thread t = new Thread(new Runnable() { 

      @Override 
      public void run() { 
       while (true) { 
        try { 
         System.out.println("Thread reading counter is: " + counter); 
         if (counter == 3) { 
          System.out.println("Counter has reached 3 now will terminate"); 
          timer.cancel();//end the timer 
          break;//end this loop 
         } 
         Thread.sleep(1000); 
        } catch (InterruptedException ex) { 
         ex.printStackTrace(); 
        } 
       } 
      } 
     }); 

     timer = new Timer("MyTimer");//create a new timer 
     timer.scheduleAtFixedRate(timerTask, 30, 3000);//start timer in 30ms to increment counter 

     t.start();//start thread to display counter 
    } 
} 
2
import java.util.Timer; 
import java.util.TimerTask; 

public class ThreadTimer extends TimerTask{ 
    static int counter = 0; 

    public static void main(String [] args) { 
     Timer timer = new Timer("MyTimer"); 
     timer.scheduleAtFixedRate(new ThreadTimer(), 30, 3000); 
    } 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     System.out.println("TimerTask executing counter is: " + counter); 
     counter++; 
    } 

}