一个JAVA定时器的疑惑

lin364653705 2009-11-20 03:43:09
首先,说明下需求,我在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
...全文
124 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ziyu0103 2009-11-20
  • 打赏
  • 举报
回复
你写一个作业来执行吧,这样比较好
云上飞翔 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lin364653705 的回复:]
Java code
Calendar cal=Calendar.getInstance();//设置时间为9点 cal.set(Calendar.HOUR_OF_DAY,9);
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND,0);
在程序当中,我如果设置时间为当前时间的后面,比如说,现在是16:00,cal.set(Calendar.HOUR_OF_DAY, 17); 那么到了17:00的时候,就到了第一次执行时间,这样就没问题!问题是,我现在都已经过了9点,我启动tomcat,他就直接执行了。。不懂!!
[/Quote]

在public void schedule(TimerTask task,Date time)的API中明白说:若日期时间已超过,则任务立即执行。我想,public void schedule(TimerTask task,
Date firstTime,
long period)的API可能也有这个立即执行的特性。
若是这样,也很简单,楼主只要把代码简单改造一下如下就行了:

Calendar cal=Calendar.getInstance(); //设置时间为9点
cal.set(Calendar.HOUR_OF_DAY, 9);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND,0);
Calendar now=Calendar.getInstance();//现在时刻
if( cal.before(now))//若时间已过期
{
cal.add(Calendar.DAY_OF_MONTH,1);//从明天9点开始

}//if 否则就是今天的9点
wjjxqld 2009-11-20
  • 打赏
  • 举报
回复
等待大牛解答
lin364653705 2009-11-20
  • 打赏
  • 举报
回复

Calendar cal=Calendar.getInstance(); //设置时间为9点
cal.set(Calendar.HOUR_OF_DAY, 9);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND,0);


在程序当中,我如果设置时间为当前时间的后面,比如说,现在是16:00,cal.set(Calendar.HOUR_OF_DAY, 17); 那么到了17:00的时候,就到了第一次执行时间,这样就没问题!问题是,我现在都已经过了9点,我启动tomcat,他就直接执行了。。不懂!!
lin364653705 2009-11-20
  • 打赏
  • 举报
回复
http://bbs3.chinaunix.net/thread-273867-1-1.html 这里看到一篇,JVM的系统时间和OS的系统时间不一致的原因,难道是这样??只是服务器使用的JBOSS
wjjxqld 2009-11-20
  • 打赏
  • 举报
回复
cal.getTime()只是获取jvm中的时间
lin364653705 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wjjxqld 的回复:]
之前有过同事也曾遇到过这种问题,原因是jvm虚拟机中的的时间与你的电脑的本地时间并不一致的原因,我记得tomcat中有的地方可以设置时区什么的
[/Quote]
设置tomcat的时区???cal.getTime(),不是当前设置的时间么?
wjjxqld 2009-11-20
  • 打赏
  • 举报
回复
之前有过同事也曾遇到过这种问题,原因是jvm虚拟机中的的时间与你的电脑的本地时间并不一致的原因,我记得tomcat中有的地方可以设置时区什么的
windforcecn 2009-11-20
  • 打赏
  • 举报
回复
推荐用quartz吧
lin364653705 2009-11-20
  • 打赏
  • 举报
回复
嗯??竟然没有变成红色。。我晕哦!!红色部分代码
timer.schedule(new AutoSendMessage(event.getServletContext()), cal.getTime(),24 * 60* 60 * 1000l);
cicigl 2009-11-20
  • 打赏
  • 举报
回复
UP

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧