一个JAVA定时器的疑惑

lin364653705 2009-11-20 04:25:53
-----汗。。刚才发到J2SE区去了!
首先,说明下需求,我在tomcat启动的时候,就加载这一监听,然后希望在早上9点的时候,定时执行某一程序。下面是代码部分.
Java code
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
...全文
171 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

//把这段加在你红字的前边
synchronized (this) {
Date d1 = new Date();
if(d1.getHours()>9)
{
System.out.println("过9点了");
}
//new一个第2天9点的时间,你可以写个更好的
Date d2 = new Date();
d2.setDate(d2.getDate()+1);
d2.setHours(9);
d2.setMinutes(0);
d2.setSeconds(0);
long i = d2.getTime()-d1.getTime();//离第2天9点差的毫秒数
System.out.println(i);
wait(i);//等待这个毫秒数,之后再执行你的程序
}
archko 2009-11-20
  • 打赏
  • 举报
回复
ScheduledThreadPoolExecutor里的三个方法可以满足你的要求,Timer已经过时了,太多的理由不适用。
lin364653705 2009-11-20
  • 打赏
  • 举报
回复
嗯??没有人知道么??
lin364653705 2009-11-20
  • 打赏
  • 举报
回复
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,他就直接执行了。。不懂!!

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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