gpt4 book ai didi

java - 如何在java中使用TaskExecutorService丢弃重叠任务

转载 作者:行者123 更新时间:2023-12-01 15:02:36 25 4
gpt4 key购买 nike

我有一个运行 2 个独立的独立 java 轮询工具的场景,它将以 5 分钟的固定间隔运行一些特定任务。

我的场景是(对于每个轮询服务):

1)如果任务T0需要超过5分钟才能运行,同时5分钟后T5来并尝试执行,我会丢弃它,而不是等待,或重新启动(丢弃重叠任务)

2)下一个任务通常会在T10开始。

我的问题是使用 Quartz 会不会太过分了?如果我使用 TaskExecutorService,我如何在时间 X 上检查一旦任务在时间 X-5 上启动就已经在运行,我应该放弃它。

注意:1)我必须使用JDK <= 6.0

2)我没有在像spring这样的任何框架下使用。

3)它是一个桌面工具,所以我需要启动它并且它会运行..

任何代码片段或方向都值得赞赏。

更新了以下评论的答案:

是的,它位于在单个工具中运行的任务之间。工具不同,工具之间没有联系,它们会单独运行,没有任何关系。

单个工具以 5 分钟的间隔运行相同的任务(就像每个文件分钟一样,它会在目录中查找文件,如果找到,则解析这些文件并使用它们)。

如果,举个例子,一旦任务当前从第一分钟开始运行(可能需要任意时间),5分钟后该工具再次启动该任务寻找新文件,但这次它不会解析/使用它,因为先前的任务已经在运行处理一些文件。因此新任务将不会执行,系统将转储它(没有队列/没有等待/没有顺序作业)。

另一个新任务将再次运行 5 倍时间,如果没有其他任务正在运行,它将解析并处理这些文件。

最佳答案

看到评论中问题的回复后,您可以使用Excecutors获得 ScheduledExecutorService 。然后,您可以使用方法scheduleWithFixedDelay提交您的任务。此方法重新运行任务,两次运行之间存在延迟。对于您的情况来说,好处是延迟计数在当前运行完成后开始。这将为您提供所需的内容,而无需使用 boolean 变量或 ReentrantLock,因为您不会同时运行两个任务。您只需要小心捕获异常,因为异常将导致任务的后续运行被取消。

因此,假设您有一个实现 runnable 的类 MyTask

public class MyTask implements Runnable{

public void run() {
try {
//your task code here
} catch (...) {
//deal with the exceptions here
}
}

}

假设您将从 main 方法运行,您现在可以使用该类来安排重复发生的任务:

public class TaskRunner{

private static final ScheduledExecutorService taskScheduler = Executors.newScheduledThreadPool(1);

public static void main(String[] args) {
taskScheduler.scheduleWithFixedDelay(new MyTask(),0,5,TimeUnit.MINUTES);
}

}

关于java - 如何在java中使用TaskExecutorService丢弃重叠任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13430751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com