2012-07-06 76 views
19

是否可以在特定時間在java中調用方法?例如,我有這樣一段代碼:如何在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(); 
} 
} 

這怎麼可以在java中完成?

回答

32

使用java.util.Timer類,您可以創建一個計時器並安排它在特定時間運行。

下面的例子:

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

你在哪裏使用'period'? – Sami 2012-07-06 11:57:05

+0

編輯答案 – 2012-07-06 12:02:05

+1

定時器的javadoc建議使用Java 5中引入的'ScheduledThreadPoolExecutor':http://stackoverflow.com/a/11361397/829571 – assylias 2016-10-25 12:57:15

6

它是可能的,如http://quartz-scheduler.org/

石英是可以與集成,或者伴隨虛擬的任何Java EE或一個全功能的,開源的作業調度服務,我會用一個庫Java SE應用程序 - 從最小的獨立應用程序到最大的電子商務系統。 Quartz可以用來創建執行數十,數百乃至數萬個作業的簡單或複雜的計劃;作業的任務被定義爲標準的Java組件,它可以執行幾乎任何你可能編程的任務。

2

你可以使用類Timer

從技術文檔:

用於線程調度將來執行任務的 設施後臺線程。可以安排一次性執行任務,或者定期重複執行任務。

方法schedule(TimerTask task, Date time)正是你想要的:安排指定的任務在指定的時間執行。

如果您需要安排cron格式,quartz將是一個很好的解決方案。 (quartz cron like schedule

2

據我所知,你可以使用Quartz-scheduler這個。我還沒有使用它,但很多人都向我推薦它。

2

可以使用ScheduledExecutorService,這是「一個更靈活更換爲Timer/TimerTask組合」(根據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則Timer類可能是什麼您正在尋找自Java 5以來可用的。

如果您需要在應用程序服務器上下文中指定一些東西,我建議您查看EJB 3.0以來的EJB定時器http://www.javabeat.net/2007/03/ejb-3-0-timer-services-an-overview/

另外,根據你真正想要做什麼,你可以詳細說明如果使用cron作業(或任何其他基於OS的定時器方法)會更合適,即你不想或不能擁有虛擬機一直在運行。

2

這是可能的。您可以使用TimerTimerTask在某個時間安排一種方法。

例如:

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

請參考以下鏈接:

1

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")); 
相關問題