1、編寫任務
package com.boonya.timer; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimerTask; /** * myTask.java * 功能:編寫定時執行的任務 * @author boonya * @version 1.0 2012-10-11 */ public class myTask extends TimerTask{ @Override public void run() { // TODO Auto-generated method stub Date mydate=new Date(); String runTime=new SimpleDateFormat("yyy-MM-dd hh:mm:ss").format(mydate); System.out.println(runTime+"定時任務正在執行........."); } }
2、設定調用簡單任務
package com.boonya.timer; import java.util.Timer; /** * RunMyTask.java * 功能:調用定時執行的任務 * @author boonya * @version 1.0 2012-10-11 */ public class RunMyTask { public static void execute(){ Timer timer = new Timer(); //一天執行一次 /*Date start=new Date(); start.setDate(start.getDate()+1); start.setHours(2); start.setMinutes(0); start.setSeconds(0); long l = start.getTime()-System.currentTimeMillis(); timer.schedule(new myTask(), l, 24*1000*60*60);*/ //1分鐘執行一次的任務 timer.schedule(new myTask(), 60000, 60*1000);//task,delay,peroid } }
3、編寫複雜任務調度策略的範圍介面
public interface SchedulerService { void schedule(TimerTask task, long delay); void schedule(TimerTask task, long delay, long period); void schedule(TimerTask task, Date firstTime, long period); void scheduleAtFixedRate(TimerTask task, long delay, long period); void scheduleAtFixedRate(TimerTask task, Date firstTime, long period); }
4、實現任務策略介面
public class SchedulerServiceImpl implements SchedulerService { //延遲多長時間調用一次就陷入線程等待 @Override public void schedule(TimerTask task, long delay) { new Timer().schedule(task, delay); } //延遲delay微秒調用一次,以後每隔period微秒執行一次 @Override public void schedule(TimerTask task, long delay, long period) { new Timer().schedule(task, delay, period); } //從firstTime開始執行,每隔period微秒執行一次 @Override public void schedule(TimerTask task, Date firstTime, long period) { new Timer().scheduleAtFixedRate(task, firstTime, period); } //延遲delay微秒調用一次,以後每隔period微秒執行一次:方法重在執行頻率 @Override public void scheduleAtFixedRate(TimerTask task, long delay, long period) { new Timer().scheduleAtFixedRate(task, delay, period); } //從firstTime開始執行,每隔period微秒執行一次:方法重在執行頻率 @Override public void scheduleAtFixedRate(TimerTask task, Date firstTime, long period) { new Timer().scheduleAtFixedRate(task, firstTime, period); } }
註:建議只使用schedule方法。
5、調度業務調用
public static void main(String[] args) { SchedulerService service=new SchedulerServiceImpl(); // execute one time then the thread turn to wait status service.schedule(new TemplateTask(), 5*1000); //start from now every 5 seconds execute my task // service.schedule(new TemplateTask(), new Date(), 5*1000); //delay 5 seconds then as 5 seconds time-step to execute my task // service.schedule(new TemplateTask(), 5*1000, 5*1000); // service.scheduleAtFixedRate(new TemplateTask(), new Date(), 5*1000); // service.scheduleAtFixedRate(new TemplateTask(), 5*1000, 5*1000); }
6、web設定項目啟動執行任務
---可以設定一個Servlet在項目啟動時啟動定時任務,web.xml配置如下:
<servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>ReadUserListHandler</servlet-name> <servlet-class>com.boonya.test.servlet.ReadUserListHandler</servlet-class> <load-on-startup>5</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ReadUserListHandler</servlet-name> <url-pattern>/servlet/ReadUserListHandler</url-pattern> </servlet-mapping>
註: <load-on-startup>說明,
在servlet的配置當中,<load-on-startup>5</load-on-startup>的含義是:
標記容器是否在啟動的時候就載入這個servlet。
當值為0或者大於0時,表示容器在應用啟動時就載入這個servlet;
當是一個負數時或者沒有指定時,則指示容器在該servlet被選擇時才載入。
正數的值越小,啟動該servlet的優先順序越高。
7、注意事項
每一個Timer僅對應唯一一個線程。
Timer不保證任務執行的十分精確。
Timer存線上程安全隱患。