2012-02-21 21 views
26

我想每天下午2點執行一項工作。 java.util.Timer哪種方法可以用來安排我的工作?如何我可以每天運行我的TimerTask 2 PM

經過2Hrs運行後,它將停止工作並重新安排下一天的下午2點。

+4

請記住[夏令時](http://en.wikipedia.org/wiki/Daylight_saving_time) – 2012-02-21 10:31:30

+0

我得到了我的答案之一,但如何在2小時後停止任務並將其重新安排到第二天 – BOSS 2012-02-21 11:07:18

回答

13
import java.util.Calendar; 
import java.util.Date; 
import java.util.GregorianCalendar; 
import java.util.Timer; 
import java.util.TimerTask; 


public class MyTimerTask extends TimerTask { 
    private final static long ONCE_PER_DAY = 1000*60*60*24; 

    //private final static int ONE_DAY = 1; 
    private final static int TWO_AM = 2; 
    private final static int ZERO_MINUTES = 0; 


    @Override 
    public void run() { 
     long currennTime = System.currentTimeMillis(); 
     long stopTime = currennTime + 2000;//provide the 2hrs time it should execute 1000*60*60*2 
      while(stopTime != System.currentTimeMillis()){ 
       // Do your Job Here 
      System.out.println("Start Job"+stopTime); 
      System.out.println("End Job"+System.currentTimeMillis()); 
      } 
    } 
    private static Date getTomorrowMorning2AM(){ 

     Date date2am = new java.util.Date(); 
      date2am.setHours(TWO_AM); 
      date2am.setMinutes(ZERO_MINUTES); 

      return date2am; 
     } 
    //call this method from your servlet init method 
    public static void startTask(){ 
     MyTimerTask task = new MyTimerTask(); 
     Timer timer = new Timer(); 
     timer.schedule(task,getTomorrowMorning2AM(),1000*10);// for your case u need to give 1000*60*60*24 
    } 
    public static void main(String args[]){ 
     startTask(); 

    } 

} 
3

我發現做這件事最簡單的方法一直是通過Windows中的Task Scheduler和Linux中的cron。

但是對Java,看看Quartz Scheduler

從他們的網站:

石英是可以 與集成,或者伴隨一個全功能的,開源的作業調度服務幾乎任何Java EE或Java SE應用程序 - 從最小的獨立應用程序到最大的電子商務系統。石英可用於創建簡單的或複雜的計劃,用於執行數十,數百或甚至數十萬個作業;其任務被定義爲標準的作業 Java組件,可以執行幾乎任何你可能編程的任何東西 他們要做的事情。 Quartz Scheduler包含許多企業級功能,例如JTA事務和集羣。

+0

我可以'使用第三方api – BOSS 2012-02-21 10:31:20

+0

看看這個[計劃週期性任務示例](http://www.javapractices.com/topic/TopicAction.do?Id=54)。 Quartz是開源的(Apache 2.0許可證),從技術上講,您可以下載源代碼並將其包含在您的項目中。 – Ali 2012-02-21 10:36:05

+1

@Ali,某些政府或銀行公司不允許在項目中使用未被接受的第三方庫...... – Rudy 2012-02-21 10:41:24

22

你可以使用Timer.schedule(TimerTask task, Date firstTime, long period)方法,今天設置firstTime到下午和設置period至24小時:

安排指定的任務進行重複的固定延遲執行,在指定的時間開始。隨後的執行大致按規定的時間間隔進行,並按指定的時間間隔分開。

+0

這是一個非常簡單的方法 – 2012-02-21 10:38:08

+2

@SunilKumarBM,是一個正面還是負面? – hmjd 2012-02-21 10:38:53

+0

顯然是積極的,這就是爲什麼我已經投票了。即使我使用相同的方法:-) – 2012-02-21 10:40:08

2

你應該嘗試使用scheduleAtFixedRate(這將重複你的任務)。您將需要創建一個TimerTask對象,該對象將指定要運行的內容(在run()中)以及何時運行(scheduledExecutionTime)。 scheduleAtFixedRate還允許您指定第一個執行日期。

1

使用公共無效調度(TimerTask的任務,日期firstTime,週期長)

作任務再次重複了第二天,剛剛成立時期86400000毫秒(這意味着1天)

Date date2pm = new java.util.Date(); 
date2pm.setHour(14); 
date2pm.setMinutes(0); 

Timer timer = new Timer(); 

timer.sc(myOwnTimerTask,date2pm, 86400000); 
+0

@Ruby如果我的工作運行了2小時,那麼下一個時間表將延遲2小時? – BOSS 2012-02-21 10:42:33

+0

是的。來自Java Docs:在固定延遲執行中,每個執行都按照前一次執行的實際執行時間進行調度。如果由於任何原因(如垃圾收集或其他後臺活動)延遲執行,後續執行也會延遲。從長遠來看,執行頻率通常會略低於指定週期的倒數(假設Object.wait(long)下的系統時鐘是準確的)。 – Rudy 2012-02-21 10:50:10

+0

3,600,000ms是一個小時! – 2013-08-07 07:06:07

40
Calendar today = Calendar.getInstance(); 
today.set(Calendar.HOUR_OF_DAY, 2); 
today.set(Calendar.MINUTE, 0); 
today.set(Calendar.SECOND, 0); 

// every night at 2am you run your task 
Timer timer = new Timer(); 
timer.schedule(new YourTask(), today.getTime(), TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS)); // period: 1 day 
+1

投票起來,但沒有被接受爲最簡單的答案,@Daniel Gerber?我想知道, – gumuruh 2016-07-15 02:46:53

+0

不能做任何關於:) – 2016-07-15 09:08:38

+0

Timer類正在使用當前從java.util.Timer或javax.swing.Timer導入?那麼如果我們想要在2PM執行時間,那麼Calendar.HOUR_OF_DAY值只能輸入14? @Daniel Gerber – gumuruh 2016-07-18 08:52:37

1

你爲什麼不使用Spring的@Scheduled(的cron = 「0 0 14 * * *」)..爲秒,分鐘,小時,天,月,星期。 V酷。您甚至可以在9:00至11:00之間指定9-11,或在最後一個參數中指定MON-FRI。 如果你想在運行時設置時間,你也可以用編程方式調用它,就像Spring的大部分情況一樣。 看到這個: - http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html

添加一個例子

@Scheduled(cron="0 0 14 * * *") 
    public void customScheduler(){ 
     try{ 
      // do what ever you want to run repeatedly 
     }catch(Exception e){ 
      e.printStackTrace(); 

     } 
    } 

還請標註含此@Component來註解類,並請在應用程序提供@EnableScheduling。java(類包含主要方法)類使Spring知道您在應用程序中使用了taskscheduler。

相關問題