当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

Timer、TimerTask实现定时业务处理

发表于: 2013-03-14   作者:boonya   来源:转载   浏览次数:
摘要: 1、编写任务 package com.boonya.timer; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimerTask; /** * myTask.java * 功能:编写定时执行的任务 * @author boonya * @version 1.0 2
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存在线程安全隐患。

Timer、TimerTask实现定时业务处理

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
原文:java定时任务类Timer和TimerTask用法详解 代码下载地址:http://www.zuidaima.com/share/1550
EJB3.0的定时服务开发过程: 关键点:首先需要使用容器对象SessionContext创建定时器,然后使用@Tim
最简单的需求,设定多长时间以后执行某个动作: public class MyTimerTask extends TimerTask{ @Over
故事起因 因业务需要,写了一个定时任务Timer,任务将在每天的凌晨2点执行,代码顺利码完,一切就绪
订餐系统之定时器Timer不定时  经过几天漫长的问题分析、处理、测试、验证,定时器Timer终于定时了
本文主要介绍JKD自带的java.util.Timer定时器的实现原理. 如果你仅仅只是想知道如何在自己的程序中
Java 自带的定时器,有两个重要的类:TimerTask和Timer。 如下: 简单的使用: package com; import
  经过几天漫长的问题分析、处理、测试、验证,定时器Timer终于定时了,于是开始了这篇文章,希望
1.webkit中timer实现的框架类图 1.1 TimerHeap其实就是一个容器,管理一个一个的Timer 1.2 ThreadTi
第一个例子。timer定时器。(这个比较简单,timer是java.util包下一个类) 为了更好的了解,我写了
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号