一次安排任务-java

一次安排任务-java,java,multithreading,scheduled-tasks,Java,Multithreading,Scheduled Tasks,我有一个定期安排的任务。有时,这可能需要比预期更长的时间。 我正在试图找到一种方法,以确保在任务已经运行的情况下取消调度。我检查的所有机制都将使任务等待,并在第一次完成后运行它 锁定当然会做的工作,但我期待的东西更高的水平 你知道ApacheCamel框架吗? 它有一个名为quartz2的模块,可以安排任何任务 请尝试阅读此页面: 有一种叫做scheduleAtFixedRate和scheduleAtFixedDelay的东西 scheduleAtFixedRate将在定义的时间启动另一个进程,

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

锁定当然会做的工作,但我期待的东西更高的水平


你知道ApacheCamel框架吗? 它有一个名为quartz2的模块,可以安排任何任务

请尝试阅读此页面:
有一种叫做scheduleAtFixedRate和scheduleAtFixedDelay的东西

scheduleAtFixedRate将在定义的时间启动另一个进程,所以若前一个进程未完成,则两个进程将运行,这可能会导致两次运行同一事物的竞争条件

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

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

@Scheduled(fixedDelay =30000)

您可以使用
ScheduledExecutorService
。这可能是您想要的,因为它将等待您的任务完成,如果一个任务的完成时间超过您指定的速度:

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

例如:

ScheduledExecutorService scheduler=Executors.newSingleThreadScheduledExecutor();
scheduleAtFixedRate(()->{
//除非上一个任务尚未完成,否则将每秒执行一次Body。
},0L,1L,时间单位为秒);

创建一个标志变量。在任务执行之前将其设置为true,在任务执行之后将其设置为false。检查它的值并跳过任务。@talex好吧,OP要求的是“更高层次的东西”。我不会说标志适合这个类别。这意味着当延迟任务完成时,下一个迭代将立即开始。有什么方法可以在下一个调度点开始吗?@user1109846怎么样?任务“在一次执行结束和下一次执行开始之间的给定延迟内”执行。@user1109846如果您的问题已经解决,请接受最佳答案。如果没有,请尝试编辑问题以尽可能地改进它。