Java定时任务的简单实现

package com.weiyuanit.test1;
import java.util.Date;
import java.util.TimerTask;
/***********************
 * @author:han  
 * @version:1.0      
 * @created:2013-11-20  
 ***********************
 */
public class MyTask extends TimerTask {
    @Override
    public void run() {
        //此处添加具体任务代码
        try {
            System.out.println(" =============== call at :" + (new Date()));
        } catch (Exception e) {
            System.out.println("-------------解析信息发生异常--------------");
            e.printStackTrace();
        }
    }
}



package com.weiyuanit.test1;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/***********************
 * 定时任务测试
 * @author:han  
 * @version:1.0      
 * @created:2013-11-20  
 ***********************
 */
public class MyListener implements ServletContextListener{
    private Timer timer = null;
                    
    //时间间隔
    private static final long PERSIOD_DAY = 24 * 60 * 60 * 1000;
                    
    public void contextDestroyed(ServletContextEvent sce) {
        // TODO Auto-generated method stub
        timer.cancel();
    }
    public void contextInitialized(ServletContextEvent sce) {
        timer = new Timer(true);
        //设置任务计划,启动和间隔时间
        //timer.schedule(new MyTask(),0, 86400000);
                        
        MyTask myTask = new MyTask();
                        
        //1.立刻开始执行myTask的任务,只执行一次
//      timer.schedule(myTask, new Date());
                        
        //2.立刻开始执行myTask的任务,执行完本次任务,隔3秒再执行一次
//      timer.schedule(myTask, new Date(),3000);
                        
        //3.5秒钟后开始执行myTask的任务,只执行一次
//      timer.schedule(myTask, 5000);
                        
        //4.5秒钟后开始执行myTask的任务,执行完本次任务后,隔3秒再执行一次
//      timer.schedule(myTask, 5000,3000);
                        
        //5.立刻开始执行myTask任务,每隔3秒再执行一次
//      timer.scheduleAtFixedRate(myTask, new Date(), 3000);
                        
        //6.秒钟后开始执行myTask任务,每隔3秒执行一次
//      timer.schedule(myTask, 5000,3000);
                        
        /**
         * 需要注意的是scheduleAtFixedRate和schedule在参数完全相同的情况下,执行效果是不同的。
         * 上面例子中任务只是打印一个字符串,比较简单。
         * 但如果任务比较复杂,或者由于任何原因(如垃圾回收或其他后台活动)而延迟了某次执行,
         * 则scheduleAtFixedRate方法将快速连续地出现两次或更多的执行,从而使后续执行能够“追赶上来”;
         * 而schedule方法的后续执行也将被延迟。
         * 所以,在长期运行中,scheduleAtFixedRate执行的频率将正好是指定周期的倒数,schedule 执行的频率一般要稍慢于指定周期的倒数。
                另外,TimerTask的构造函数是protected,所以无法再类中直接new一个TimerTask,而只能写一个类继承TimerTask。
         */
                        
/*      try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(" 1 ");
        //timer.cancel();//结束任务执行,程序并不终止
        System.out.println(" 2 ");*/
                        
                        
        //7.定制每日夜里2:00执行方法
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 14);
        calendar.set(Calendar.MINUTE, 24);
        calendar.set(Calendar.SECOND, 0);
                        
        //第一次执行定时任务的时间
        Date date = calendar.getTime();
                        
        /**
         * 如果第一次执行定时任务的时间 小于 当前的时间,
         * 此时要在 第一次执行定时任务的时间 加一天,以便此任务在下个时间点执行。
         * 如果不加一天,任务会立即执行
         */
        if (date.before(new Date())) {
            date = this.addDate(date, 1);
        }
        //timer.schedule(myTask, date,PERSIOD_DAY);
                        
        timer.schedule(myTask, date,5000);
                        
                        
        /**
         * 注意事项:
         * 一定要注意时间点的问题。如果你设定在凌晨2点执行任务。但你是在2点以后发布程序
         * 或是重启过服务。那这样的情况下,任务会立即执行,而不是等到第二天的凌晨2点再执行。
         * 为了避免这种情况发生,只能判断一下,如果发布或重启服务的时间晚于定时执行任务的时间,
         * 就在此基础上加一天。
         */
                        
    }
    /**
     * 增加或减少天数
     * *******************
     * @author: han
     * 2013-11-21
     * *******************
     * @param date
     * @param num
     * @return
     */
    public Date addDate(Date date,int num) {
        Calendar startDate = Calendar.getInstance();
        startDate.setTime(date);
        startDate.add(Calendar.DAY_OF_MONTH, num);
        return startDate.getTime();
    }
                    
}



<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
            
  <!-- test1包 -->
  <listener>
    <listener-class>com.weiyuanit.test1.MyListener</listener-class>
  </listener>
            
</web-app>



可以去下载:java定时任务小例子

你可能感兴趣的:(java,实现,定时任务)