-----汗。。刚才发到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 

解决方案 »

  1.   

    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,他就直接执行了。。不懂!!
       
      

  2.   

    ScheduledThreadPoolExecutor里的三个方法可以满足你的要求,Timer已经过时了,太多的理由不适用。
      

  3.   


    //把这段加在你红字的前边
    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);//等待这个毫秒数,之后再执行你的程序
    }