无限循环+ Thread.sleep替换cron作业

时间:2014-09-16 01:02:40

标签: java multithreading cron sleep infinite-loop

所以今天我脑子里有了一个想法...而且我想听一些反馈。我有一个Java应用程序,需要每5分钟检查一个目录。简单而简单的应用程序需要每五分钟运行一次。

似乎是cronjob的一个很好的候选者,但我想知道......为什么不保持逻辑/时间在应用程序中如此(显然简化):

public static void main(String[] args) {
    while(true) { // repeatedly execute...
        // do the work/job
        Thread.sleep(600 * 1000); // make the thread sleep for 5 minutes
    }
}

我看到的一个重要缺点是"一旦它启动,我们如何停止这个应用程序?删除它?

除了那个之外还有其他重要的缺点吗?

我应该停止做白日梦而只是使用cron工作吗?

4 个答案:

答案 0 :(得分:5)

许多重大缺点:

  • 如果您想更改轮询频率(即每2分钟或每10分钟执行一次),则必须更改程序。如果您有不规则的投票时间表,尤其是星期一到星期五每5分钟一次,但周六和周日每15分钟一次。当然,你不会认为你的程序将需要这样做,但需求会不断发展。
  • 正如你所说,杀死进程是阻止程序的唯一方法。在中间过程中杀死它可能是一件坏事。你当然可以添加一些取消逻辑,但那是额外的开发时间。
  • 程序占用内存,而它坐在那里什么都不做(大部分时间)。这是浪费资源。当您使用具有许多GB内存的系统时,可能不是什么大不了的事,但是当您处理内存有限的嵌入式系统时,这会成为一个问题。
  • 当你已经在操作系统中内置了一个非常好的调度程序时,你在浪费时间编写自己的调度,然后必须调试和维护。

我把这个节目称为“捕捉程序”,因为它的行为就像一只猫:它大部分时间都在睡觉,现在醒来然后伸展,也许可以用一根绳子敲打几分钟,然后再回到睡觉。 Programs are not cats

答案 1 :(得分:2)

您可以使用ScheduledExecutorService以固定费率运行任务,并在某些操作上停止此操作(此处阅读System.in):

public static void main(String[] args) throws InterruptedException {
    ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
    ses.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            // do some work
        }
    }, 0, 5, TimeUnit.MINUTES);  // every 5 minutes

    // when anything is entered, the task is stopped
    Scanner sc = new Scanner(System.in);
    String whatever = sc.next();
    // shutdown the executor
    ses.shutdown();
    ses.awaitTermination(15, TimeUnit.SECONDS);
}

答案 2 :(得分:2)

像所建议的那样的解决方案的优点是它可以在没有cron的操作系统上工作(但每个操作系统都有某种调度程序)。

另一方面,使用cron具有以下优势:

  • 任务将在下一个预定时间运行,即使它崩溃了;显示的解决方案在崩溃后不会再次运行,直到有人重新启动它。

  • Cron将在重启后重新开始运行任务;提出的解决方案并没有这样做。

  • 当任务停止然后定期关闭时,内存泄漏不如长时间运行过程那么重要。

通过列举随着时间推移已添加到OS级别作业调度程序的更多功能,无疑可以延长此列表。

答案 3 :(得分:0)

我会在我的应用程序中使用石英调度程序。链接http://quartz-scheduler.org/

它确实可以控制,当你启动应用程序时它会运行,当你的应用程序停止时它会停止。虽然有更多的设置,但它非常灵活。