一个JAVA定时器的疑惑

lin364653705 lin364653705 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
首先,说明下需求,我在tomcat启动的时候,就加载这一监听,然后希望在早上9点的时候,定时执行某一程序。下面是代码部分.

public class ContextListener extends HttpServlet implements
ServletContextListener {

/**
*
*/
private static final long serialVersionUID = 1L;

public ContextListener() {

}

private java.util.Timer timer = null;

public void contextInitialized(ServletContextEvent event) {

timer = new java.util.Timer(true);
event.getServletContext().log("定时器已启动");

Calendar cal=Calendar.getInstance(); //设置时间为9点
cal.set(Calendar.HOUR_OF_DAY, 9);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND,0);
//System.out.println(cal.getTime()) ;
//今天是2009-11-20,打印的结果:Fri Nov 20 09:00:00 CST 2009

timer.schedule(new AutoSendMessage(event.getServletContext()), cal.getTime(),
24 * 60* 60 * 1000l);

event.getServletContext().log("已经添加任务调度表");
}

public void contextDestroyed(ServletContextEvent event) {

timer.cancel();

event.getServletContext().log("定时器销毁");

}

}

方法schedule(TimerTask task, Date firstTime, long period) 安排指定的任务在指定的时间开始进行重复的固定延迟执行。
在AutoSendMessage中实现TimerTask,可以理解成一个简单的输出语句。

问题就是:代码中,红色的部分, cal.Time()是第一次执行的时间, 24 * 60* 60 * 1000l间隔24小时。
那么现在时间是 2009-11-20 15:25:00, 我的期望是不执行,因为现在不是早上9点。
但是AutoSendMessage中的方法,还是执行了。

这是什么原因???还有,应该怎样修改,才能和期望一样,每天早上执行??我随时都可能要重启服务器,tomcat启动的时候,就会进入ContextListener
...全文
评论 11
收藏 已收藏
分享
返回顶部
lin364653705
Java SE 62,621 成员 307,251 内容