2012-01-29 13 views
9

Chcę mieć klasę, która zmienia swoje prywatne zmienne co 2 sekundy. Wiem, że jeśli zrobię coś podobnegoTworzenie przypomnienia powtarzalnego zegara w Javie

import java.util.Timer; 
//... 
Timer timer; 
//... 
timer.schedule(new ChangeSomething(), 2000); 

będzie wykonywał ChangeSomething() po 2 sekundach, czy istnieje sposób, aby poinformować go, aby zrobić coś co 2 sekundy, lub, jeśli mogę umieścić wewnątrz ChangeSomething()

timer.schedule(new ChangeSomething(), 2000); 

czy to działa?

Dokładnie to, co robi timer.cancel()?

Odpowiedz

11

Zastosowanie timer.scheduleAtFixedRate() zaplanować go powtarzać co dwie sekundy:

Harmonogramy określone zadanie do wielokrotnego wykonywania stałym oprocentowaniu, które rozpoczynają się w określonym czasie. Kolejne egzekucje odbywają się w przybliżeniu w regularnych odstępach czasu, oddzielonych określonym czasem.

Z javadoc dla Timer.cancel():

kończy ten licznik, odrzucając jakiekolwiek aktualnie zaplanowanych zadań. Nie koliduje z aktualnie wykonywanym zadaniem (jeśli istnieje). Po zakończeniu działania timera jego wątek wykonania kończy się z gracją i nie można już na nim zaplanować żadnych zadań.

EDIT:

Związany z gwintem wewnętrznym wykonanie dla Timer który wykonuje pojedyncze zadanie jednorazowo:

Po ostatnim żywego odniesienia do obiektu Timer odchodzi i wszystkie zaległe zadania zostały zakończone wykonanie, wątek wykonywania zadań timera kończy się z wdziękiem (i staje się przedmiotem garbage collection). Jednak może to zająć dość długo. Domyślnie wątek wykonywania zadań nie działa jako wątek demona, więc jest w stanie zatrzymać aplikację przed zakończeniem. Jeśli osoba dzwoniąca chce szybko zakończyć wątek wykonywania zadań przez timer, wywołujący powinien wywołać metodę anulowania licznika czasu.

+0

Co ja nie rozumiem o timer.cancel(), to czy nie jest to wymagane, aby zrobić po tym, jak zrobić zadanie, że to było zaplanowane tylko raz, aby upewnić się, że nie zostanie to zrobione ponownie, czy nie? – SIMEL

+0

Javadoc dla 'Timer' wskazuje, że nie jest to wymagane, a wątek wykonywania timera zakończy się. Jednak wyraźnie zaznacza, że ​​może to trwać dość długo, a funkcja 'cancel()' może zostać użyta do szybszego zakończenia. (Wkleiłem odpowiedni akapit z Javadoc do odpowiedzi). – hmjd

0

Aby być dokładniejszym tutaj: ChangeSomething() jest konstruktorem twojej klasy ChangeSomething. Konstruktor zostanie wykonany natychmiast po przekazaniu obiektu instancji ChangeSomething do zegara, a nie po 2 sekundach. Jest to metoda run() obiektu uruchamiana po 2 sekundach.

Aby wykonać tę metodę run(), aż wszystkie 2 sekundy, użyj schedule(TimerTask task, long delay, long period)

6

Trzeba będzie zadzwonić do innej metody planowania zegara, zwanego scheduleAtFixedRate (...), które mogą dostać 3 parametry. Pierwsze 2 są identyczne z harmonogramem, którego używasz, natomiast trzeci parametr wskazuje czas w milisekundach między kolejnymi wykonaniami zadań.

import java.util.Timer; 
//... 
Timer timer; 
//... 
timer.scheduleAtFixedRate(new ChangeSomething(), 2000, 2000); 

Można sprawdzić doc java pai dla tej metody tutaj: http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html#scheduleAtFixedRate(java.util.TimerTask, java.util.Data, long)

2

Oto przykład

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

public class Test extends TimerTask { 
    private int age; 

    public Test() { 
     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(this, new Date(), 2000); 
    } 

    /** 
    * Implements TimerTask's abstract run method. 
    */ 
    public void run(){ 
     //toy implementation 
     System.out.print("Changing Data ... before change age is "+age+" "); 
     changeAge(); 
     System.out.println("after change age is "+age); 

    } 


    private void changeAge() { 
     age = (int)Math.round(Math.random()*1000); 
    } 

    public static void main(String[] args) { 
      new Test(); 
    } 

}

+0

nowy zegar(); = nie jest możliwe, musisz poprawnie dodać parametry? –

+0

@SvenB Zgodnie z Java Docs: http://docs.oracle.com/javase/7/docs/api/java/util/Timer.html, Timer ma domyślny konstruktor. –