关于定时器的使用疑问?在线等
我定义了一个定时器,每隔一分钟处理数据600条(发送短信,并修改短信状态),正常情况下只需30秒就可以了。但由于异常情况下,处理不完那么多数据,下次循环又处理此纪录,应该怎么办呢? 
 我的想法是1分钟还是去扫描600条,如果没有处理完,下次扫描则顺延,上次数据没处理完,定时器不能执行。请问能实现吗?多谢啦!!! 
 web.xml 
  <listener>  
              <listener-class> SMSListener </listener-class>  
  </listener>    
 SMSListener.java 
 public   class   SMSListener   extends   HttpServlet   implements   ServletContextListener   { 
       private   static   Timer   timer;   
       public   SMSListener()   { 
       }   
       public   void   contextInitialized(ServletContextEvent   event)   { 
             timer   =   new   Timer(true); 
             //1分钟执行600条新短信插入 
             timer.schedule(new   SMSTask(event.getServletContext()),   0,      60*1000); 
       }   
       public   void   contextDestroyed(ServletContextEvent   event)   { 
             timer.cancel(); 
       }   
 }   
 SMSTask.java 
 public   class   SMSTask   extends   TimerTask   { 
       private   ServletContext   context   =   null;   
       public   SMSTask()   { 
       }   
       public   SMSTask(ServletContext   context)   { 
             this.context   =   context; 
       }   
       public   void   run(){ 
             try   { 
                   //业务逻辑 
             } 
             catch   (Exception   e)   { 
                   e.printStackTrace(); 
             } 
       }   
 }
------解决方案--------------------定义一个全局的flag指示上一次的task是否完成。
------解决方案--------------------如果数据不能删除的话,可以定义一个表示当前处理位置指针的变量,处理完一条数据改变一下指针。下次循环从当一次指针所指示位置开始处理数据。   
 如果楼主不想采用多线程的方式,为防止这次循环没结束又开始下一次循环而造成处理混乱,应规定本次循环的执行时间为一固定时间。每处理完一条数据算一下当前用时,如果超过规定时间,则结束本次循环。这个时间应小于定时器的时间,留有一点余量。比如定时器是30秒,则这个时间应定为20秒至25秒。     
 另外一个办法是给每条记录加一个是否已处理的状态标记。这样处理一条改变一下状态。这种方式,即使是对于多线程的方式也有效。   
 再有就是建立一个待发送数据池,每处理一条就从池中把该数据删除。这个对多线程方式也有效。
------解决方案--------------------为什么用定时器?这样你用什么标志都不能根本解决问题。建议使用多线程,在线程内sleep你需要的时间,可以保证顺序执行。   
 类似的发短信程序我也写过,一秒发送一次都没有问题,单次发送量几万。