Java定时任务

来源:互联网 发布:sql怎么用别名查询 编辑:程序博客网 时间:2024/06/06 00:52
在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等。这次,在我们的开发中,就有这么一个需求.某个功能执行需要的时间比较长,则决定采用定时器的方式,每隔一段时间系统自动执行此功能,当界面真正触发时,只需要简单的读取结果,而不需要执行复杂的逻辑判断.那如何实现此功能呢?要想实现它,首先我们需要认识了解几个jdk封装的类.

  Java.util.Timer:一种线程设施,用于安排以后再后台线程中执行的任务.可安排任务执行一次或者定期重复执行.其中几个方法需要我们注意一下:

  cancel():终止此计时器,丢弃所有当前已安排的任务。

  schedule(TimerTask task, Date time):安排在指定的时间执行指定的任务。

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

  schedule(TimerTask task, long delay):安排在指定延迟后执行指定的任务。

  schedule(TimerTask task, long delay, long period):安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。

  scheduleAtFixedRate(TimerTask task, Date firstTime, long period):安排指定的任务在指定的时间开始进行重复的固定速率执行。

  scheduleAtFixedRate(TimerTask task, long delay, long period):安排指定的任务在指定的延迟后开始进行重复的固定速率执行。

  在上面提到的Timer的几个方法中,参数中都涉及到了TimerTask类.那TimerTask类是干嘛的呢?他就是Timer所安排的任务,即被设置的要执行一次或多次的任务.这个类中下面这几个方法需要我们多加注意。

  cancel():取消此计时器任务。

  run():此计时器任务要执行的操作。这里是具体操作的代码实现。

  通过Timer和TimerTask两个类,我们就能实现任务的重复执行了。但是,我们并没有事情执行的起止点。我们不要人为的去触发事情的执行,我们要通过代码让服务自己去执行。这样,我们就需要一个监听,去监听当前是否符合执行的条件。ServletContextListener为我们实现此功能。此接口能够监听ServletContext对象的生命周期,实际上就是监听Web应用的生命周期。当Servlet容器启动或终止Web应用时,会触发ServletContextEvent事件,该事件由ServletContextListener来处理。涉及到的两个方法为:

  contextInitialized(ServletContextEvent sce);初始化;

  contextDestroyed(ServletContextEvent sce)销毁

  到这里,准备工作就做好了。下面我们来看一个例子定时器具体是怎样实现的。

package com.boco.transnms.server.bo.stat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class NFDFlightDataTaskListener implements ServletContextListener{
 @Override
 public void contextDestroyed(ServletContextEvent arg0) {
  //销毁时的代码
 }
 @Override
        //在服务启动时,执行此方法。
 public void contextInitialized(ServletContextEvent arg0) {
     new TimerManager();
 }
}
//要执行的任务
class NFDFlightDataTimerTask extends TimerTask{
 @Override
 //此方法为具体要定时操作的方法
 public void run() {
  System.out.println("定时器测试:"+System.currentTimeMillis());
 }
}
class TimerManager{
 private static final long PERIOD_DAY=6 * 1000;  //每隔六秒执行一次
 public TimerManager() {                  
     Timer timer = new Timer();     //定时器实例化
      NFDFlightDataTimerTask task = new NFDFlightDataTimerTask();   //要执行的任务
      //安排指定的任务在指定的时间开始进行重复的固定延迟执行。  
              timer.schedule(task,new Date(),PERIOD_DAY); 
       }   
}

  既然监听是在服务启动的时候就有了,自然离不开配置文件了。那web.xml配置文件是如何配置的呢?

<listener>

         <!—此处为实现监听接口的完整的包名类名-->

       <listener-class>

                com.boco.transnms.server.bo.stat.NFDFlightDataTaskListener

       </listener-class>

</listener>

  到这里定时器的实现就完全实现了,运行一下我们就会发现,控制台中每隔6秒,就会给我们打印出“定时器测试***”。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 没居住证想上东莞牌怎么办 外地考驾照需要暂住证怎么办 考驾照期间暂住证过期怎么办 b2驾照扣了6分怎么办 c1驾照扣了11分怎么办 c1驾驶证分扣9分怎么办 驾驶证c照扣6分怎么办 驾照过期1个月怎么办 上海驾驶证b证扣分怎么办 临时牌驾照丢了怎么办 行驶证年审过期两年怎么办 驾证到期了没换怎么办 在非洲被蚊子咬怎么办 身份证丢了被非法贷款怎么办 未满16岁怎么办身份证 放弃继承权后想反悔怎么办 上海居住证积分中社保断怎么办 换驾驶证但是身份证地址变动怎么办 驾驶证b证扣分了怎么办 c1驾证过期没审怎么办 驾照报名三年过期了怎么办 新车行驶证过期了怎么办 行驶证忘了审怎么办 摩托车驾驶证副本丢了怎么办 人被全险车撞了怎么办 被全险车撞了怎么办 驾驶证和行驶证遗失怎么办 户口迁移身份证没换驾照怎么办 户口迁回时身份证掉了怎么办 户口毕业托管身份证掉了怎么办 身份证和户口都掉了怎么办 毕业生户口迁回原籍没身份证怎么办 落户上海后怎么办医保卡 小车临时牌过期了怎么办 驾驶证地址错了一个字怎么办 驾驶证名下车辆有违章怎么办 a2如果扣12分怎么办 b2一次超速12分怎么办 b2本扣了12分怎么办 驾照扣了27分怎么办 大车一次扣12分怎么办