java 中已經(jīng)有一個 timer 類可以用來進(jìn)行執(zhí)行計劃,定時任務(wù)。我們所要做的只是繼續(xù) java.util.TimerTask 類。如下所示:
package com.yourcompany.scheduling;
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. //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(), // TimerTask date.getTime(), // Timer 1000 * 60 * 60 * 24 * 7 // delay) }; 這里有幾個問題,我們的類繼續(xù)了TimerTask ,而timerTask 也是實現(xiàn)了 java.lang.Runnable 接口。我們所要做的只是在我們自己的類里重置 run() 方法。所以我們的TimerTask類其實是一種線程,但線程的調(diào)度往往不是按照我們希望來實現(xiàn)的,因為一些垃圾收集等原因,我們計劃的時間點,卻沒有執(zhí)行必要的任務(wù)。這樣會產(chǎn)生一些問題。雖然,Timer 類也提供了scheduleAtFixedRate() 方法用來在垃圾收集后能夠快速的追上任務(wù)進(jìn)度,但這個不一定是我們所需要的。非凡是在 一些 J2EE 服務(wù)器上 Timer 是無法控制的,因為它不在容器的權(quán)責(zé)范圍內(nèi)。另外的,這個任務(wù)調(diào)度也缺乏一些企業(yè)級所需要的 非凡 日期定制的功能,以及修改,查找任務(wù)的功能。 這里我們要介紹的是一個開源項目:Quartz . Quartz 定義了兩種 基本接口 Job 和 Trigger . 看名字也就知道,我們的任務(wù)必須實現(xiàn) Job, 我們的時間觸發(fā)器定義在 Trigger 內(nèi)。 看一個例子也許能更快的了解他的使用方法:package com.yourcompany.scheduling; import org.quartz.*; public class QuartzReport implements Job { public void execute(JobExecutionContext cntxt) //必須實現(xiàn)的方法 throws JobExecutionException { System.out.println("Generating report - " + cntxt.getJobDetail().getJobDataMap().get("type")); //TODO Generate report } public static void main(String[] args) { try { SchedulerFactory schedFact
新聞熱點
疑難解答