2012-07-06 17 views
19

È possibile chiamare un metodo in java in un momento specifico? Per examplef Ho un pezzo di codice come questo:Come chiamare un metodo su un tempo specifico in 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(); 
} 
} 

Come questo può essere fatto in java?

risposta

32

Utilizzando una classe java.util.Timer è possibile creare un timer e pianificarlo per l'esecuzione in un momento specifico.

Di seguito si riporta l'esempio:

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

dove usi 'periodo'? – Sami

+0

ha modificato la risposta –

+1

Timer's javadoc consiglia di utilizzare 'ScheduledThreadPoolExecutor' che è stato introdotto in Java 5: http://stackoverflow.com/a/11361397/829571 – assylias

6

La sua è possibile, e vorrei usare una libreria come http://quartz-scheduler.org/

quarzo è un open source di servizio full-optional job scheduling che può essere integrata con, o utilizzati lungo il lato praticamente qualsiasi EE Java o Applicazione Java SE: dalla più piccola applicazione stand-alone al più grande sistema di e-commerce. Il quarzo può essere utilizzato per creare programmi semplici o complessi per l'esecuzione di decine, centinaia o persino decine di migliaia di lavori; lavori i cui compiti sono definiti come componenti Java standard che possono eseguire praticamente qualsiasi cosa tu possa programmarli.

2

è possibile utilizzare la classe Timer

Da documentazione:

Una struttura per le discussioni di pianificare le attività per l'esecuzione futuro in un thread di sfondo. Le attività possono essere pianificate per l'esecuzione una tantum o per l'esecuzione ripetuta a intervalli regolari.

Il metodo schedule(TimerTask task, Date time) è esattamente ciò che si desidera: Pianifica l'attività specificata per l'esecuzione all'ora specificata.

Se è necessario pianificare nel formato cron, quartz sarebbe una buona soluzione. (quartz cron like schedule)

2

Come noto, è possibile utilizzare Quartz-scheduler per questo. Non l'ho ancora usato, ma molte persone me lo hanno consigliato.

2

È possibile utilizzare un ScheduledExecutorService, che è "un sostituto più versatile per la combinazione Timer/TimerTask" (secondo 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

Se si sta parlando di SE allora la classe Timer potrebbe essere quello che stai cercando http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Timer.html, disponibile da Java 5.

Se hai bisogno di cronometrare qualcosa in un contesto server di applicazioni, ti consiglio di dare un'occhiata ai timer EJB http://www.javabeat.net/2007/03/ejb-3-0-timer-services-an-overview/ disponibili da EJB 3.0.

In alternativa, a seconda di cosa si sta realmente cercando di fare, è possibile elaborare se utilizzare un cron job (o qualsiasi altro metodo di timer basato su OS) sarebbe più adatto, ovvero non si desidera o non si può avere il VM in esecuzione tutto il tempo.

2

È possibile.È possibile pianificare un metodo in qualsiasi momento utilizzando Timer e TimerTask.

Ad esempio:

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); 

consultare questi link:

1

semplice demo di 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")); 
Problemi correlati