- Java项目中常使用的定时器有JDK Timer、Quartz、Spring Task等三种。Quartz的功能强大,配置也比较复杂,适合大型、多定时任务的项目使用。Spring Task配置较为简单轻量,需要Spring框架支持。JDK自带的定时器Timer使用灵活,配置简单,适合中小型项目。
- 项目需要引入的类:java.util.Timer、java.util.TimerTask;
- 定时需要有一个触发的方法,本例示范的是使用监听器实现定时任务触发
- 配置如下:web.xml加入监听配置:
<listener>
<listener-class>com.project.controller.test.JdkTaskInstance</listener-class>
</listener>
- 在com.project.controller.test下新建JdkTaskInstance类:
package com.project.controller.test;
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class JdkTaskInstance implements ServletContextListener{
private static final long PERIODTIME = 1* 60 * 1000;// 1分钟
@Override
//实例化方法
public void contextInitialized(ServletContextEvent sce) {
Timer timer = new Timer();
TaskMethod task = new TaskMethod();
int PERIOD = 1;
timer.schedule(task, 0, PERIOD*PERIODTIME);
//以下api讲解摘抄自网络
// 第一种方法:指定任务task在指定时间time执行
//schedule(TimerTask task, Date time)
// 第二种方法:指定任务task在指定延迟delay后执行
//schedule(TimerTask task, long delay)
// 第三种方法:指定任务task在指定时间firstTime执行后,进行重复固定延迟频率peroid的执行
// schedule(TimerTask task, Date firstTime,long period)
// 第四种方法:指定任务task 在指定延迟delay 后,进行重复固定延迟频率peroid的执行
// schedule(TimerTask task, long delay, long period)
// 第五种方法:指定任务task在指定时间firstTime执行后,进行重复固定延迟频率peroid的执行
// scheduleAtFixedRate(TimerTask task,Date firstTime,long period)
// 第六种方法:指定任务task 在指定延迟delay 后,进行重复固定延迟频率peroid的执行
// scheduleAtFixedRate(TimerTask task, long delay, long period)
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
}
- 定时任务方法:
package com.project.controller.test;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimerTask;
public class TaskMethod extends TimerTask{
public void run() {
Date dt = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
TextToFile("D:\\Task.txt","定时执行 :"+sdf.format(dt));
}
public void TextToFile(final String strFilename, final String strBuffer)
{
try{
File fileText = new File(strFilename);
if (!fileText.exists()) {
fileText.createNewFile();
}
FileWriter fileWriter = new FileWriter(fileText,true);
PrintWriter out = new PrintWriter(fileWriter);
out.println(strBuffer);
out.close();
fileWriter.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
执行结果如下,在D盘的Task.txt文件中写入了数据:
定时执行 :2018年03月06日 16时46分52秒
定时执行 :2018年03月06日 16时47分52秒
定时执行 :2018年03月06日 16时48分52秒