码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA之Timer定时器

时间:2015-08-18 14:27:33      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

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中添加以下代码:

<listener>  

        <listener-class>sample.hello.resources.TimeListener</listener-class>  

</listener>

监听器代码如下:

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("===============定时任务方法开始执行====");
     }

}

JAVA之Timer定时器

标签:

原文地址:http://my.oschina.net/zhengweishan/blog/493891

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!