2012-07-06 12 views
19

Czy można wywołać metodę w języku Java w określonym czasie? Na przykład mam taki kod:Jak wywołać metodę o określonej godzinie w java?

class Test{ 
.... 
// parameters 
.... 

public static void main(String args[]) { 
    // here i want to call foo at : 2012-07-06 13:05:45 for instance 
    foo(); 
} 
} 

Jak to zrobić w java?

Odpowiedz

32

Za pomocą klasy java.util.Timer można utworzyć timer i zaplanować jego uruchomienie w określonym czasie.

Poniżej znajduje się przykład:

//The task which you want to execute 
private static class MyTimeTask extends TimerTask 
{ 

    public void run() 
    { 
     //write your code here 
    } 
} 

public static void main(String[] args) { 

    //the Date and time at which you want to execute 
    DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    Date date = dateFormatter .parse("2012-07-06 13:05:45"); 

    //Now create the time and schedule it 
    Timer timer = new Timer(); 

    //Use this if you want to execute it once 
    timer.schedule(new MyTimeTask(), date); 

    //Use this if you want to execute it repeatedly 
    //int period = 10000;//10secs 
    //timer.schedule(new MyTimeTask(), date, period); 
} 
+0

gdzie używasz 'okresu'? – Sami

+0

edytował odpowiedź –

+1

Jawnik czasowy poleca użycie 'ScheduledThreadPoolExecutor', który został wprowadzony w Javie 5: http://stackoverflow.com/a/11361397/829571 – assylias

6

Jest to możliwe, i chciałbym użyć biblioteki takie jak http://quartz-scheduler.org/

Kwarc jest w pełni funkcjonalny, open source usługi planowanie zadań, które mogą być zintegrowane z, lub stosować u boku praktycznie każdy Java EE lub Aplikacja Java SE - od najmniejszej samodzielnej aplikacji do największego systemu e-commerce. Kwarc może być używany do tworzenia prostych lub złożonych harmonogramów wykonywania dziesiątek, setek, a nawet dziesiątków tysięcy zadań; zadania, których zadania są zdefiniowane jako standardowe komponenty Java, które mogą wykonywać praktycznie wszystko, co można zaprogramować.

2

Można użyć klasy Timer

Z dokumentacji:

Instrument dla wątków do harmonogramu zadań dla przyszłej realizacji w sposób wątek tła. Zadania mogą być planowane do jednorazowego wykonania lub dla powtarzalnego wykonywania w regularnych odstępach czasu.

Metoda schedule(TimerTask task, Date time) jest dokładnie tym, czego potrzebujesz: Planuje określone zadanie do wykonania o określonej godzinie.

Jeśli potrzebujesz harmonogramu w formacie cron, dobrym rozwiązaniem będzie quartz. (quartz cron like schedule)

2

Można użyć ScheduledExecutorService, która jest „bardziej uniwersalny zamiennik dla kombinacji Timer/TimerTask” (według Timer's javadoc):

long delay = ChronoUnit.MILLIS.between(LocalTime.now(), LocalTime.of(13, 5, 45)); 
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 
scheduler.schedule(task, delay, TimeUnit.MILLISECONDS); 
2

Jeśli mówimy o SE wówczas Klasa Timer może być co szukasz http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Timer.html, dostępnej od wersji Java 5.

Jeśli potrzebujesz czasu w kontekście serwera aplikacji, polecam przejrzenie zegarów EJB http://www.javabeat.net/2007/03/ejb-3-0-timer-services-an-overview/ dostępnych od wersji EJB 3.0.

Alternatywnie, w zależności od tego, co naprawdę próbujesz zrobić, możesz opracować, czy użycie zadania cron (lub innej metody zegara opartej na systemie operacyjnym) byłoby bardziej odpowiednie, tj. Nie chcesz lub nie możesz mieć VM działa cały czas.

2

Jest to możliwe.Możesz zaplanować metodę w pewnym momencie, używając Timer i TimerTask.

Na przykład:

Calendar calendar = Calendar.getInstance(); 
calendar.set(Calendar.HOUR_OF_DAY, 10); 
calendar.set(Calendar.MINUTE, 30); 
calendar.set(Calendar.SECOND, 0); 

Date alarmTime = calendar.getTime(); 

Timer _timer = new Timer(); 
_timer.schedule(foo, alarmTime); 

sprawdź te linki:

1

Proste demo java.util.Timer

Timer t=new Timer(); 
t.schedule(new TimerTask() { 
    public void run() { 
     foo(); 
    } 
}, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2012-07-06 13:40:20")); 
Powiązane problemy