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定时任务小例子
转载于:https://blog.51cto.com/hanchaohan/1329591