2013-09-04 16 views
9

Scenariusz wygląda następująco:Metoda połączenia po pewnym opóźnieniu w java

W mojej aplikacji otworzyłem jeden plik, zaktualizowałem go i zapisałem. Po zwolnieniu pliku zapisanego zdarzenia wykona jedną metodę: abc(). Ale teraz chcę dodać opóźnienie po zwolnieniu zdarzenia save, powiedzmy 1 minutę. Więc dodałem Thread.sleep(60000). Teraz po 1 minucie uruchomi się metoda abc(). Do tej pory wszystko działa dobrze.

Załóżmy jednak, że użytkownik zapisał plik 3 razy w ciągu 1 minuty, metoda zostanie wykonana 3 razy po każdej 1 minucie. Chcę wykonać metodę tylko raz w ciągu następnej minuty po pierwszym zapisaniu wywołanym z najnowszą zawartością pliku.

Jak mogę obsłużyć taki scenariusz?

+1

użyj timertask –

+2

Użyj 'ScheduledExecutorService'. Zapisz przyszłość zwróconą przez metodę 'schedule' i' cancel' ją, jeśli później jest inna akcja zapisu. –

+4

Duplikat http://stackoverflow.com/questions/2258066/java-run-a-function-after-a-specific-number-of-seconds – Swapnil

Odpowiedz

12

Zastosowanie Timer i TimerTask

utworzyć zmienną składową typu Timer w YourClassType

powiedzmy: private Timer timer = new Timer();

i metoda będzie wyglądać następująco:

public synchronized void abcCaller() { 
    this.timer.cancel(); //this will cancel the current task. if there is no active task, nothing happens 
    this.timer = new Timer(); 

    TimerTask action = new TimerTask() { 
     public void run() { 
      YourClassType.abc(); //as you said in the comments: abc is a static method 
     } 

    }; 

    this.timer.schedule(action, 60000); //this starts the task 
} 
+2

Pojedyncza instancja 'Timer' zadziała; tylko * zadania * wymagają anulowania i zmiany harmonogramu. –

+0

okej, dobry punkt –

0

Jeśli używasz Thread.sleep(), po prostu zmień statyczną metodę statyczną zmienną globalną do czegoś, co można użyć do wskazania blokowania wywołania metody?

public static boolean abcRunning; 
public static void abc() 
{ 
    if (YourClass.abcRunning == null || !YourClass.abcRunning) 
    { 
     YourClass.abcRunning = true; 
     Thread.Sleep(60000); 
     // TODO Your Stuff 
     YourClass.abcRunning = false; 
    } 
} 

Czy istnieje jakiś powód, dla którego to by nie zadziałało?

Powiązane problemy