Timer、TimerTask实现定时业务处理

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存在线程安全隐患。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值