2011-08-06 76 views
13

我對Java相對比較陌生,並且已經選擇了一個可以工作的項目。但是,我遇到了一個塊。我需要一種方法在一天中的某個特定時間運行。我已經完成了很多搜索,但是我找不到任何看起來可以實現的技巧。我跑進了Timer類,但它似乎以特定的時間間隔運行。調度程序類似乎具有相同的問題。我也遇到了Quartz,但我認爲我需要更輕量級的東西,我只能看到如何間隔地做事情。也許,僅僅因爲我是新人,我已經錯過了一些能夠幫助我在這些課程中的東西,但我很困難並且可以使用一些幫助。每天在特定時間運行Java方法

如果有人可以指示我一個班級在一天中的某個特定時間點上班,每天(可以取消該活動的獎勵積分),並告訴我如何正確使用班級,這將是很棒的!

TL; DR:需要一個班級在一天中的某個時間執行某些操作,而不是每隔一段時間執行一次,因爲該程序可能會在一天中多次重新啓動。

+2

我寫了一篇文章重寫這一點。這可能可以幫助你:http://harryjoy.wordpress.com/2011/07/09/create-a-scheduler-task-in-java/ –

+0

@ Harry Joy很有幫助。我不知道Quartz –

回答

26

試圖獲取更多信息的TimerTask類

退房 http://oreilly.com/java/archive/quartz.html

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

public class ReportGenerator extends TimerTask { 

    public void run() { 
    System.out.println("Generating report"); 
    //TODO generate report 
    } 

} 

class MainApplication { 

    public static void main(String[] args) { 
    Timer timer = new Timer(); 
    Calendar date = Calendar.getInstance(); 
    date.set(
     Calendar.DAY_OF_WEEK, 
     Calendar.SUNDAY 
    ); 
    date.set(Calendar.HOUR, 0); 
    date.set(Calendar.MINUTE, 0); 
    date.set(Calendar.SECOND, 0); 
    date.set(Calendar.MILLISECOND, 0); 
    // Schedule to run every Sunday in midnight 
    timer.schedule(
     new ReportGenerator(), 
     date.getTime(), 
     1000 * 60 * 60 * 24 * 7 
    ); 
    }//Main method ends 
}//MainApplication ends 
+3

+1:我也喜歡石英。但是使用它與使用cron啓動任務相比,它使你的責任是,應用程序永遠不會崩潰,如果它仍然崩潰,會自動重新啓動等。 – Daniel

+2

請注意,在DST發生更改後,這會被破壞!然後計時器將延遲或快速運行一小時,這裏是上午1點或晚上11點(取決於它是在夏天開始並轉換到冬天時間,還是相反)。 – Philipp

+0

我添加了date.set(Calendar.AM_PM,Calendar.AM);或PM以使其在我預期的準確時間工作。 –

4

我強烈建議,如果可能的話,最好的方法是使用操作系統的調度程序調用腳本或Java應用程序:例如,* nix中的「cron」或Windows中的「任務調度程序」 。

+0

我會第二個建議。爲什麼重新實現一切,並擔心管理Java應用程序呢? @Eegabooga你真的需要Java嗎?如果您需要輕量級解決方案,您可以實施輕量級解決方案,但重複建設的數量可能會很大,並且可能不會那麼強大。 –

+0

謝謝大家的回覆。但是,我幾乎100%肯定這需要在Java中。這不是需要每天在特定時間重新啓動的程序,而是程序所執行的操作。即使克朗可以做到這一點,這個程序是不適合我,但其他人。我所做的是一個遊戲服務器的插件,並且該插件掛載到這個人的服務器上。如果可能的話,我可以給他發送他需要的cron文件,但是請記住我需要一種在程序中運行的方法,而不是程序本身(對不起,如果語法錯誤,仍在學習) –

+0

好吧,我現在看到,我可以通過Java和Quartz運行一個cronjob。 –

2

一種可能是使用外部調度程序 - 根據所需要的精度。在UNIX上使用CRON,在Windows上使用Windows計劃程序。這很好地隔離了時間與做。

您可以使用計時器並創建一個簡單的類,根據所需的粒度檢查每分鐘或5分鐘的時間。這將是非常輕量級的。

相關問題