安排在24小时间隔

时间:2012-03-08 12:59:23

标签: java multithreading

我想知道安排代码的最佳方法。我有一个代码可以生成报告并以24小时的间隔向一组人发送邮件。它是基于控制台的java应用程序。我想知道安排它的最佳方法。有时我可能需要将其更改为12小时间隔。但是,应用程序不会在间隔之间执行任何其他任务。

4 个答案:

答案 0 :(得分:5)

以下是一些方法,从最简单到最全面:

  1. sleep()

    TimeUnit.HOURS.sleep(24)
    

    这种方法很简单,做工作并睡24小时。实际上它有点复杂,因为报告生成需要一些时间,所以你必须稍微睡一会儿。以下所有解决方案都可以透明地处理这个问题。

  2. java.util.Timer#scheduleAtFixedRate() - 简单的内置Java解决方案。

  3. 中的
  4. @Scheduled注释中的@Schedule - 更复杂,但也更强大,例如接受表达式:

    @Scheduled(fixedRate=DateUtils.MILLIS_PER_DAY)
    public void generateReport() {
      //...
    }
    
  5. - 完整的Java调度程序,具有群集和故障转移,失火处理,完整支持等。非常全面:

    newTrigger().
      withSchedule(
        simpleSchedule().
          withIntervalInHours(24).
          repeatForever()
        ).build();
    

    newTrigger().
      withSchedule(
        cronSchedule().
          dailyAtHourAndMinute(17, 30).  //17:30
        ).build();
    

答案 1 :(得分:0)

我使用两种方式:

首先针对非托管代码,例如客户端代码: Chron4J

第二个是在JavaEE框架中实现的。当您使用像Glassfish / JBoss这样的容器时,可以通过注释方法使用它。会是这样的:

@Schedule(second="*/1", minute="*",hour="*", persistent=false)
public void doWork(){
    System.out.println("timer: " + helloService.sayHello());
}

答案 2 :(得分:0)

如果我是你,我会看看石英调度员。 我在许多应用程序中使用它,它非常容易使用。 您可以在此处找到更多信息:http://quartz-scheduler.org/

如果您使用弹簧堆栈,我肯定会推荐它,因为它非常容易在xml中配置,让spring为您注入所有东西。

答案 3 :(得分:0)

好吧,如果程序可以空闲,请尝试这样的事情

try
{
for (;;) {
    //code
    Thread.sleep(1000 * 60 * 60 * 24);
    //code
    }
}
catch(Exception e)
{
     System.out.println(e);
}