2012-07-29 12 views
11

Mam wątek, który jest odpowiedzialny za wykonywanie niektórych procesów. Chcę sprawić, aby przetwarzanie odbywało się co 3 sekundy. Użyłem kodu poniżej, ale gdy wątek się zaczyna, nic się nie dzieje. Założono, że po zdefiniowaniu zadania dla mojego licznika czasu automatycznie wykonuję ScheduledTask w określonym przedziale czasowym, ale to nic nie da. Czego mi brakuje?Timer w Java Wątek

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

Czy jesteś pewien, że tworzysz wątek 'temperatureUp' i wywołujesz' start() '? Ten kod działa dobrze dla mnie. –

+0

Dlaczego używałbyś zarówno nici, jak i timera? Timer działa na własnym wątku –

Odpowiedz

1

Myślę, że metoda, z której korzystasz, ma podpis schedule(TimerTask task, long delay). W efekcie opóźniasz tylko czas rozpoczęcia TYLKO egzekucji.

Aby zaplanować uruchamianie co 3 sekundy, należy użyć tej metody schedule(TimerTask task, long delay, long period), w której do określenia przedziału czasu wykorzystywany jest parametr trzeci.

Można odwołać się do definicji klasy Timer, żeby być z dalszej pomocy

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

+0

z linią 'increaserTimer.schedule (increaseTemperature, 2000, 2000);' nadal nic się nie dzieje! – Afflatus

+0

@Elham - Nie zauważyłem tego wcześniej, ale tworzysz nowy wątek z innego wątku? To bardzo złe podejście. Zastanów się nad zmianą struktury, aby wątki były tworzone i planowane na poziomie globalnym. Oto link do przykładowego projektu, który pomoże ci zmienić strukturę: http://www.roseindia.net/java/example/java/util/CertainAndRepeatTime.shtml – afrin216

+0

innymi słowy, nie mogę użyć Timera, aby zaplanować seria działań wykonywanych przez wątek. dobrze? – Afflatus

2

Aby zrobić coś co trzy sekundy należy użyć scheduleAtFixedRate (patrz javadoc).

Jednak twój kod naprawdę nic nie robi, ponieważ tworzysz wątek, w którym uruchamiasz zegar tuż przed zatrzymaniem wątku (nie ma już nic więcej do zrobienia). Kiedy wyzwalany jest timer (który jest wyzwalaczem pojedynczego strzału), nie ma wątku do przerwania (zakończony wcześniej).

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

Kilka błędów w fragmencie kodu:

  • rozszerzyć klasę Thread, co nie jest naprawdę dobra praktyka
  • Masz Timer obrębie Thread? To nie ma sensu, jako że Timer działa na własnym Thread.

Należy raczej (kiedy/gdzie jest to konieczne), zaimplementować Runnable zobaczyć here na krótki przykład, jednak nie widzę potrzeby zarówno Thread i Timer we fragmencie dałeś.

Proszę patrz poniższy przykład pracy Timer który będzie po prostu zwiększamy licznik o jeden za każdym razem, gdy jest wywoływany (co 3 sekundy):

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 
    } 
} 

Uzupełnienie:

Zrobiłem krótki przykład włączenia do mieszanki Thread. Więc teraz TimerTask będzie jedynie przyrost counter o 1 co 3 sekundy, a Thread wyświetli counter s wartość spania dla 1 sekundy za każdym razem sprawdza licznik (będzie wypowiedzieć się i timer po 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++; 
    } 

}