Java定时任务的实现
程序员文章站
2022-05-21 19:04:44
...
java.util.Timer定时器,实际上是个线程,定时调度所拥有的TimerTasks。
一个TimerTask实际上就是一个拥有run方法的类,需要定时执行的代码放到run方法体内,TimerTask一般是以匿名类的方式创建。
依据Java自身提供的接口实现,通过监听器(Listener)和定时器(Timer)定时执行某个任务(Task)。
专业的开源工具可参考Quartz:http://www.opensymphony.com/quartz/
Java Web版
MyListener:
MyTask:
web.xml配置:
Java版
下面是一个完整的例子,由两个类组成,一个定制任务,一个调用java.util.Timer
定制任务:
调用java.util.Timer:
本例中将定时任务设定为守护线程,马上开始执行,每个1000ms重复执行,5s后主线程结束,由于是守护线程,故随着主线程的结束,定时任务也结束。
一个TimerTask实际上就是一个拥有run方法的类,需要定时执行的代码放到run方法体内,TimerTask一般是以匿名类的方式创建。
java.util.Timer timer = new java.util.Timer(true); // true 说明这个timer以daemon方式运行(优先级低, 程序结束timer也自动结束),注意,javax.swing 包中也有一个Timer类,如果import中用到swing包,要注意名字的冲突。 TimerTask task = new TimerTask() { public void run() { ... //每次需要执行的代码放到这里面。 } }; //以下是几种调度task的方法: timer.schedule(task, time); // time为Date类型:在指定时间执行一次。 timer.schedule(task, firstTime, period); // firstTime为Date类型,period为long // 从firstTime时刻开始,每隔period毫秒执行一次。 timer.schedule(task, delay) // delay 为long类型:从现在起过delay毫秒执行一次 timer.schedule(task, delay, period) // delay为long,period为long:从现在起过delay毫秒以后,每隔period毫秒执行一次。 java.util.Timer timer = new java.util.Timer(true); // true 说明这个timer以daemon方式运行(优先级低, 程序结束timer也自动结束),注意,javax.swing包中也有一个Timer类,如果import中用到swing包,要注意名字的冲突。 TimerTask task = new TimerTask() { public void run() { ... //每次需要执行的代码放到这里面。 } }; //以下是几种调度task的方法: timer.schedule(task, time); // time为Date类型:在指定时间执行一次。 timer.schedule(task, firstTime, period); // firstTime为Date类型,period为long // 从firstTime时刻开始,每隔period毫秒执行一次。 timer.schedule(task, delay) // delay 为long类型:从现在起过delay毫秒执行一次。 timer.schedule(task, delay, period) // delay为long,period为long:从现在起过delay毫秒以后,每隔period毫秒执行一次。
依据Java自身提供的接口实现,通过监听器(Listener)和定时器(Timer)定时执行某个任务(Task)。
专业的开源工具可参考Quartz:http://www.opensymphony.com/quartz/
Java Web版
MyListener:
import java.util.Timer; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class MyListener implements ServletContextListener { private Timer timer = null; public void contextInitialized(ServletContextEvent event) { timer = new Timer(true);//true设置定时器为守护线程,当此程序只剩下守护线程时,JVM退出 //设置任务计划,启动和间隔时间 timer.schedule(new MyTask(), 0, 86400000); } public void contextDestroyed(ServletContextEvent event) { timer.cancel(); } }
MyTask:
import java.util.TimerTask; public class MyTask extends TimerTask { public void run() { // System.out.println("call at " + (new Date())); // TODO 此处添加具体任务代码 } }
web.xml配置:
<listener> <listener-class>com.fastunit.samples.listener.MyListener</listener-class> </listener>
Java版
下面是一个完整的例子,由两个类组成,一个定制任务,一个调用java.util.Timer
定制任务:
import java.util.TimerTask; public class TimeTask extends TimerTask { @Override public void run() { System.out.println("running"); } }
调用java.util.Timer:
本例中将定时任务设定为守护线程,马上开始执行,每个1000ms重复执行,5s后主线程结束,由于是守护线程,故随着主线程的结束,定时任务也结束。
import java.util.Timer; public class TimerTest { public static void main(String[] args) { Timer timer = new Timer(true); timer.schedule(new TimeTask(), 0,1000); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } }
上一篇: Java定时任务的实现
下一篇: 最常见的5个导致 RAC 实例崩溃的问题