当前位置: 首页 > news >正文

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存在线程安全隐患。

相关文章:

  • windows宿主机与linux目标机联网通信
  • 腾讯面试题(持续更新ing)
  • 几种排序算法与运用实例
  • 计算文件夹下.h和.cpp文件的总行数
  • 为什么仍还用C编码?
  • 线程同步
  • AndEngine安全移除精灵的方式
  • 可评审代码之道
  • JDK的动态代理
  • 实验一 Linux基本环境
  • 病毒原理实例
  • 利用jodconverter+openoffice+flexpaper实现的在线文档系统核心demo
  • 八数码编码(优化数据结构,优化算法)
  • mac 下 git svn 设置代理
  • 实时机票/火车票抓取系统整体架构
  • canvas 高仿 Apple Watch 表盘
  • css选择器
  • download使用浅析
  • OSS Web直传 (文件图片)
  • scrapy学习之路4(itemloder的使用)
  • 半理解系列--Promise的进化史
  • 产品三维模型在线预览
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 前端临床手札——文件上传
  • 使用agvtool更改app version/build
  • 在Unity中实现一个简单的消息管理器
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (二)springcloud实战之config配置中心
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (六)vue-router+UI组件库
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (一)基于IDEA的JAVA基础10
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • ***原理与防范
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .net Signalr 使用笔记
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .net6使用Sejil可视化日志
  • .NetCore 如何动态路由
  • .NetCore项目nginx发布
  • .net打印*三角形
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • [ JavaScript ] JSON方法
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [20170728]oracle保留字.txt
  • [202209]mysql8.0 双主集群搭建 亲测可用
  • [C++]C++类基本语法
  • [go] 迭代器模式
  • [HackMyVM]靶场Boxing
  • [HNOI2008]水平可见直线
  • [JMS 3] ActiveMQ实现简单的helloworld
  • [Linux] Apache的配置与运用