博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA之Timer定时器
阅读量:6079 次
发布时间:2019-06-20

本文共 2831 字,大约阅读时间需要 9 分钟。

hot3.png

1、原理

JDK中,定时器任务的执行需要两个基本的类:java.util.Timer;java.util.TimerTask;

 java.util.Timer定时器,实际上是个线程,定时调度所拥有的TimerTasks。一个TimerTask实际上就是一个拥有run方法的类,需要定时执行的代码放到run方法体内,TimerTask一般是以匿名类的方式创建。

要运行一个定时任务,最基本的步骤如下:

1、建立一个要执行的任务TimerTask。
2、创建一个Timer实例,通过Timer提供的schedule()方法,将TimerTask加入到定时器Timer中,同时设置执行的规则即可。

Timer中的schedule()方法是有多种重载格式的,以适应不同的情况。该方法的格式如下:

 void schedule(TimerTask task, Date time) 安排在指定的时间执行指定的任务。
 void schedule(TimerTask task, Date firstTime, long period) 安排指定的任务在指定的时间开始进行重复的固定延迟执行。
 void schedule(TimerTask task, long delay) 安排在指定延迟后执行指定的任务。
 void schedule(TimerTask task, long delay, long period) 安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。

2、解释

    Timer是线程安全的,此类可扩展到大量同时安排的任务(存在数千个都没有问题)。其所有构造方法都启动计时器线程。可以调用cancel() 终止此计时器,丢弃所有当前已安排的任务。purge()从此计时器的任务队列中移除所有已取消的任务。此类不提供实时保证:它使用 Object.wait(long) 方法来安排任务。

 
    TimerTask是一个抽象类,由 Timer 安排为一次执行或重复执行的任务。它有一个抽象方法run()----计时器任务要执行的操作。因此,每个具体的任务类都必须继承TimerTask类,并且重写run()方法。另外它还有两个非抽象的方法:
 boolean cancel() 取消此计时器任务。
 long scheduledExecutionTime() 返回此任务最近实际 执行的安排 执行时间。

3、在web中的简单使用

    由于我们希望当Web工程启动时,定时器能自动开始计时,这样在整个Web工程的生命期里,就会定时的执行任务,因此启动定时器的类不能是一般的类,此处用Servlet的监听器类来启动定时器,通过在配置文件里配置此监听器, 让其在工程启动时自动加载运行,存活期为整个Web工程生命期。

web.xml中添加以下代码:

          
sample.hello.resources.TimeListener
  

监听器代码如下:

package sample.hello.resources;import java.util.Timer;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;public class TimeListener implements ServletContextListener{  private Timer timer = null;  public TimeListener() {  // TODO Auto-generated constructor stub } @Override public void contextDestroyed(ServletContextEvent arg0) {  // TODO Auto-generated method stub        timer.cancel();          arg0.getServletContext().log("定时器销毁");  } @Override public void contextInitialized(ServletContextEvent arg0) {  // TODO Auto-generated method stub            /**          * 设置一个定时器          */          timer = new Timer(true);                    arg0.getServletContext().log("定时器已启动");            /**          * 定时器到指定的时间时,执行某个操作(如某个类,或方法)          */          //后边最后一个参数代表监视器的监视周期          timer.schedule(new AppTimeTask(arg0.getServletContext()), 0, 5000);            arg0.getServletContext().log("已经添加任务调度表");  }}

定时任务代码:

package sample.hello.resources;import java.util.TimerTask;import javax.servlet.ServletContext;public class AppTimeTask extends TimerTask {     private ServletContext context = null;     public AppTimeTask() {          super();     }      public AppTimeTask(ServletContext context) {          this.context = context;     }       @Override     public void run() {      // TODO Auto-generated method stub                      *//**                      * 此处写执行任务代码                      *//*                      System.out.println("===============定时任务方法开始执行====");     }}

转载于:https://my.oschina.net/zhengweishan/blog/493891

你可能感兴趣的文章
Basic4android (Basic for Android) - Rapid Application Development
查看>>
Asp.net web Api源码分析-ParameterBindingAttribute
查看>>
Numpy, Scipy, and Pandas – Oh My! (Ubuntu 11.10) » Adam Klein's Blog
查看>>
操作系统设计与实现:深入解析 1
查看>>
重装系统后恢复之前MySQL数据库-解决 1146-table doesn't exist!
查看>>
asp.net搜索引擎(网络爬虫)设计及研发
查看>>
如何找出错误ora-07445发生时系统执行的语句
查看>>
设置 OpenShift 的时区
查看>>
浮点数与定点数【2】
查看>>
CSS
查看>>
poj1450
查看>>
指针与数组
查看>>
Android用户界面开发(18):ScrollView
查看>>
CSDN博客地址
查看>>
频道信息[置顶] MPEG-2 数字视频技术参考指南 (7)—— ATSC数字电视标准
查看>>
70句经典爱情语录:爱情总是在患得患失的时候最美好!
查看>>
对象序列化对象的序列化和反序列化
查看>>
GNU Gettext for Delphi, C++ and Kylix
查看>>
Linux进程间通信(三)---管道通信之有名管道及其基础实验
查看>>
在ARC中使用weak报错和文件目录找不到的解决方法
查看>>