标签:
JDK中,定时器任务的执行需要两个基本的类:java.util.Timer;java.util.TimerTask;
java.util.Timer定时器,实际上是个线程,定时调度所拥有的TimerTasks。一个TimerTask实际上就是一个拥有run方法的类,需要定时执行的代码放到run方法体内,TimerTask一般是以匿名类的方式创建。
要运行一个定时任务,最基本的步骤如下:
1、建立一个要执行的任务TimerTask。
2、创建一个Timer实例,通过Timer提供的schedule()方法,将TimerTask加入到定时器Timer中,同时设置执行的规则即可。
Timer中的schedule()方法是有多种重载格式的,以适应不同的情况。该方法的格式如下:
void schedule(TimerTask task, Date time) 安排在指定的时间执行指定的任务。
void schedule(TimerTask task, Date firstTime, long period) 安排指定的任务在指定的时间开始进行重复的固定延迟执行。
void schedule(TimerTask task, long delay) 安排在指定延迟后执行指定的任务。
void schedule(TimerTask task, long delay, long period) 安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。
Timer是线程安全的,此类可扩展到大量同时安排的任务(存在数千个都没有问题)。其所有构造方法都启动计时器线程。可以调用cancel() 终止此计时器,丢弃所有当前已安排的任务。purge()从此计时器的任务队列中移除所有已取消的任务。此类不提供实时保证:它使用 Object.wait(long) 方法来安排任务。
TimerTask是一个抽象类,由 Timer 安排为一次执行或重复执行的任务。它有一个抽象方法run()----计时器任务要执行的操作。因此,每个具体的任务类都必须继承TimerTask类,并且重写run()方法。另外它还有两个非抽象的方法:
boolean cancel() 取消此计时器任务。
long scheduledExecutionTime() 返回此任务最近实际 执行的安排 执行时间。
由于我们希望当Web工程启动时,定时器能自动开始计时,这样在整个Web工程的生命期里,就会定时的执行任务,因此启动定时器的类不能是一般的类,此处用Servlet的监听器类来启动定时器,通过在配置文件里配置此监听器, 让其在工程启动时自动加载运行,存活期为整个Web工程生命期。
web.xml中添加以下代码:
<listener> <listener-class>sample.hello.resources.TimeListener</listener-class> </listener>
监听器代码如下:
package sample.hello.resources; import java.util.Timer; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class TimeListener implements ServletContextListener{ private Timer timer = null; public TimeListener() { // TODO Auto-generated constructor stub } @Override public void contextDestroyed(ServletContextEvent arg0) { // TODO Auto-generated method stub timer.cancel(); arg0.getServletContext().log("定时器销毁"); } @Override public void contextInitialized(ServletContextEvent arg0) { // TODO Auto-generated method stub /** * 设置一个定时器 */ timer = new Timer(true); arg0.getServletContext().log("定时器已启动"); /** * 定时器到指定的时间时,执行某个操作(如某个类,或方法) */ //后边最后一个参数代表监视器的监视周期 timer.schedule(new AppTimeTask(arg0.getServletContext()), 0, 5000); arg0.getServletContext().log("已经添加任务调度表"); } }
定时任务代码:
package sample.hello.resources; import java.util.TimerTask; import javax.servlet.ServletContext; public class AppTimeTask extends TimerTask { private ServletContext context = null; public AppTimeTask() { super(); } public AppTimeTask(ServletContext context) { this.context = context; } @Override public void run() { // TODO Auto-generated method stub *//** * 此处写执行任务代码 *//* System.out.println("===============定时任务方法开始执行===="); } }
标签:
原文地址:http://my.oschina.net/zhengweishan/blog/493891