首先,介绍Java定时器(java.util.Timer)有定时执行计划任务的功能,通过设定定时器的间隔时间,会自动在此间隔时间后执行预先安排好的任务(java.util. TimerTask)
如: 每隔一个小时执行任务 timer.schedule(TimerTask, 0, 60 * 60 * 1000)。
schedule()方法的
第一个参数是需要执行的任务,此类的类型为java.util.TimerTask,
第二个参数为执行任务前等待时间,此处0表示不等待,第三个参数为间隔时间,单位为毫秒。
/**
* 定时任务测试类
* @author admin
*
*/
public class TimerScheduleDemo extends TimerTask {
public TimerScheduleDemo() {
}
@Override
public void run() {
print();
}
public static void main(String[] args) {
Timer timer = new Timer();
long delay1 = 1 * 1000;
long period1 = 1000;
// 从现在开始 1*1000 秒钟之后,每隔 1 秒钟执行一次
timer.schedule(new TimerScheduleDemo(), delay1, period1);
/*long delay2 = 2 * 1000;
long period2 = 2000;
// 从现在开始 2 秒钟之后,每隔 2 秒钟执行一次
timer.schedule(new TimerScheduleDemo(), delay2, period2); */
}
public static void print(){
System.out.println("method start");
}
}
但是:
由于我们希望当Web工程启动时,定时器能自动开始计时,这样在整个Web工程的生命期里,就会定时的执行任务,因此启动定时器的类不能是一般的类,此处用Servlet的监听器类来启动定时器,通过在配置文件里配置此监听器, 让其在工程启动时自动加载运行,存活期为整个Web工程生命期。
任务类 主要的业务代码
/**
* 定时器任务类:即调度任务类
* @author admin
*/
public class DelFileTask extends TimerTask{
private static boolean isRunning = false;
private ServletContext context = null;
public DelFileTask() {
super();
}
public DelFileTask(ServletContext context) {
this.context = context;
}
@Override
public void run() {
if (!isRunning) {
context.log("开始执行指定任务");
/**
* 自己的业务代码
*/
isRunning = false;
context.log("指定任务执行结束");
} else {
context.log("上一次任务执行还未结束");
}
}
}
这个类 主要是继承 TimerTask并实现它的run 方法
下面就是监听类了 监听服务器的启动并将任务添加到任务栈
/**
* servlet监听器:监听服务启动时执行调度任务
* @author admin
*
*/
public class ContextListener implements ServletContextListener{
public ContextListener() {
}
private java.util.Timer timer = null;
/**
* 初始化定时器
* web 程序运行时候自动加载
*/
@Override
public void contextInitialized(ServletContextEvent arg0) {
/**
* 设置一个定时器
*/
timer = new java.util.Timer(true);
arg0.getServletContext().log("定时器已启动");
/**
* 定时器到指定的时间时,执行某个操作(如某个类,或方法)
*/
//设置执行时间
Calendar calendar =Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day =calendar.get(Calendar.DAY_OF_MONTH);//每天
//定制每天的16:10:00执行,
calendar.set(year, month, day, 16, 10, 00);
Date date = calendar.getTime();
System.out.println(date);
int period = 1000;
//每天的date时刻执行task,每隔persion 时间重复执行
timer.schedule(new DelFileTask(arg0.getServletContext()), date, period);
//在 指定的date时刻执行task, 仅执行一次
//timer.schedule(new DelFileTask(arg0.getServletContext()), date);
arg0.getServletContext().log("已经添加任务调度表");
}
/**
* 销毁
*/
@Override
public void contextDestroyed(ServletContextEvent arg0){
timer.cancel();
arg0.getServletContext().log("定时器销毁");
}
}
这个类 主要是设置一个调度器 并让他 按一定的要求去执行任务。
任务类 监听器类 都实现了 下一步就是在web.xml 配置监听器了
<listener>
<listener-class>ContextListener</listener-class>
</listener>
到了这里 一个简单的定时器基本上实现了 也能跑通了