您的位置:首页 > 编程语言 > Java开发

Java定时任务的简单实现

2013-11-21 15:31 453 查看
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世界” 博客,请务必保留此出处http://hanchaohan.blog.51cto.com/2996417/1329591
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: