JAVA-如何实现TIMER功能 |
2004-11-8
Author :Meanson Wang
Email:meansonw@hotmail.com
Date:2004-11-8
JAVA里面要实现日程管理[每天或每月的某时执行某个任务],可以用timer和TimerTask来实现。 本文会介绍如何实现一个日程的方法。这里会设计两个类,一个侦听类,用来定时执行任务[可执行多个任务].一个任务类,用来调用任务.以下是实现每天15:00执行一个任务. 1.listener class package timer; import java.util.TimerTask; import java.util.Timer; import javax.servlet.*; public class RemindListener implements ServletContextListener { private java.util.Timer timer = null; public void contextInitialized(ServletContextEvent sce) { timer = new java.util.Timer(true); sce.getServletContext().log(new java.util.Date()+"Timer start up!"); timer.schedule(new RemindTask(),0,60*60*1000);//every 60 minute roll sce.getServletContext().log(new java.util.Date()+"Schedule loaded!"); } public void contextDestroyed(ServletContextEvent sce) { timer.cancel(); sce.getServletContext().log(new java.util.Date()+"Timer destroyed!"); } } 2.Task class package timer; import java.util.TimerTask; import java.util.Calendar; public class RemindTask extends TimerTask{ private static final int C_SCHEDULE_HOUR = 15; private static boolean isRunning = false; public RemindTask() { } public void run() { Calendar cal = Calendar.getInstance(); if (!isRunning) { if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY)) { isRunning = true; System.out.println(new java.util.Date()+"task start"); //TODO for example int i = 0; while (i++ < 10) { System.out.println(new java.util.Date()+"Done!task" + i + "/" + 10); } isRunning = false; System.out.println(new java.util.Date()+"All task Done!"); } } else { System.out.println(new java.util.Date()+"Task existed!"); } } } 3.loadonstart in web.xml <listener> <listener-class>timer.RemindListener</listener-class> </listener> 4.restart server 注意:当您为您的应用设置了虚拟机,定时器会启动两个.任务会执行两次!我的解决方法是为日程管理另起一个应用. |