一次安排任务 - java

时间:2016-10-08 19:46:49

标签: java multithreading scheduled-tasks

我有一项定期安排的任务。有时可能需要比预期更长的时间。 我试图找到一种方法来确保在任务已经运行的情况下取消调度。我检查的所有机制都会使任务等待并在第一次完成后运行它

锁定课程将完成工作,但我正在寻找更高水平的东西

任何想法

3 个答案:

答案 0 :(得分:3)

您可以使用ScheduledExecutorServicescheduleAtFixedRate可能是你想要的,因为它等待你的任务完成,如果你需要比你指定的 rate 更长的时间:

  

如果执行此任务的时间超过其周期,则后续执行可能会延迟,但不会同时执行。

示例:

ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

scheduler.scheduleAtFixedRate(() -> {
    // Body will be executed every second unless the previous task hasn't finished.
}, 0L, 1L, TimeUnit.SECONDS);

答案 1 :(得分:1)

有一种叫做scheduleAtFixedRate和scheduleAtFixedDelay的东西。

scheduleAtFixedRate将在定义的时间启动另一个进程,因此如果前一个进程没有完成,将运行两个进程,这可能会导致两次运行相同的竞争条件。

scheduleAtFixedDelay将在任务完成后的固定时间后启动。

scheduleAtFixedRate vs scheduleWithFixedDelay

在Spring中,您可以使用注释来执行此操作: -

@Scheduled(fixedDelay =30000)

http://howtodoinjava.com/spring/spring-core/4-ways-to-schedule-tasks-in-spring-3-scheduled-example/

答案 2 :(得分:0)

你知道Apache Camel框架吗? 它有一个名为quartz2的模块,很有可能安排任何任务。

尝试阅读此页面: http://camel.apache.org/quartz2.html