2011-03-12 74 views
0

我运行一个IRC bot,它需要在两个集小时的聊天呼应的消息,为此,每隔几分钟:执行的方法来检查的时间和特定的时间执行的方法

我试图做的:

 public void timerTest(int minH,int maxH, int minT){ 
     boolean b = true; 
     boolean timeout = false; 
     while(b){ 
      while(!timeout){ 
       if(c.get(Calendar.HOUR_OF_DAY) >= minH && c.get(Calendar.HOUR_OF_DAY) <= maxH && c.get(Calendar.MINUTE) % minT == 0){ 
        sendMessage(channel,spam1.getMessage()); 
        timeout = true; 
        } 
       } 
       if(c.get(Calendar.MINUTE)%minT == 1){ 
        timeout = false; 
       } 
      } 
     } 

我常想垃圾邮件的邮件2-6之间,每15分钟我试图把它在unendless while循环,但不建议这样做。我寻找Timer和TimerTask,但我无法弄清楚如何正确地做到这一点。如果有人会如此善意地解释我如何实现这一目标?

谢谢^^

+0

显示如何创建'c' – adarshr 2011-03-12 16:16:45

+0

,并且您帖子右侧的“相关问题”都无法帮助您? – smas 2011-03-12 16:21:09

+0

为什么不推荐使用循环? – 2011-03-12 16:23:49

回答

1

的Java TimerTimerTask不是真能胜任复杂的调度需求,如你的。

我会建议您调查quartz。它允许你安排例如使用cron表达式,这是非常强大的。我认为像下面的表达式可能是有用的:

*/15 2-6 * * * ? 
+0

谢谢,它似乎令人难以置信的强大,将玩一段时间:p – 2011-03-12 16:43:51

+0

我仍然有一个问题,虽然我正在运行我的IRCbot但它仍然需要能够定期在类中运行一个方法,因为它使用另一种方法来自另一个只能被初始化一次的对象。但我似乎只能安排一堂课? – 2011-03-12 17:21:26

+0

@Lucas,你实现了'job'接口,它可以让你运行一个方法。参见['例子1 - 你的第一个Quartz程序](http://www.quartz-scheduler.org/docs/examples/Example1.html) – 2011-03-12 18:32:05

0

一个非常简单的想法可能是使用Spring和做这个任务 任务框架看一看 http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/scheduling.html

你可以简单地注释你的类方法与 @Scheduled(cron = "*/15 2-6 * * * ?")

或者,如果你不希望包括Spring的依赖,你可以创建的ScheduledThreadPoolExecutor

实例
// set the poolsize to 1 
    ScheduledExecutorService scheduler = new ScheduledThreadPoolExecutor(1); 
    scheduler.scheduleWithFixedDelay(new Runnable() { 
     @Override 
     public void run() { 
      // call method 
     } 
    }, 2,2, TimeUnit.HOURS); 

这使您能够灵活地安排可以定期调用您的方法的runnable。确保在应用程序关闭时关闭执行程序,否则应用程序可能会挂起。