【问题标题】:Force regular execution of periodic task within Java application在 Java 应用程序中强制定期执行周期性任务
【发布时间】:2012-08-03 22:08:30
【问题描述】:

ScheduledExecutorService 似乎存在这样的问题,即如果它无法获得空闲线程,则周期性任务将延迟发生。对我来说不幸的是,它分配给的定期任务确实需要按计划进行。目前它被安排为每分钟一次,但有时由于应用程序正忙于其他事情(我认为这就是原因)它未能在五分钟内完成,而五分钟恰好是“主要生产错误”阈值。

如何通过优先级或以其他方式控制线程平衡器来强制执行此操作?

【问题讨论】:

  • 您的 ScheduledExecutorService 是否用于除该任务之外的任何其他任务?您的任务是否总是在 1 分钟内完成?
  • 信息不足。你实际上是如何调度线程的?显示一些代码。
  • @assylias - 宾果游戏。在这个任务上还有另一个任务需要很长时间,我将它编程为只使用一个线程,这样我就可以避免一些并发编码问题。我可以通过将其移至单独的执行程序服务来解决。您可以将此作为答案发布,我会接受,因为这两个问题正是要问的。
  • @djechlin “我将它编程为只使用一个线程,这样我就可以避免一些并发编码问题。” => 你的任务无论如何都会在它自己的线程中运行,所以增加执行程序使用的线程数不应该带来任何问题,而只有一个线程不会出现(除非我遗漏了有关您所做工作的一些细节)。
  • @assylias 有 3 个任务在此服务上运行。紧急的是轻量级,可以并发运行没问题。另外两个都在修改同一个集合,并且没有仔细编程。因此,紧急任务可以转移到它自己的服务并获得它自己的线程,只要两个冲突的任务保持单线程(或者除非我努力使它们可并行化,这在这一点上是不值得的)。跨度>

标签: java multithreading scheduling


【解决方案1】:

如果您的 ScheduledExecutorService 用于其他任务,或者您的任务有时需要超过 1 分钟才能运行,您可以简单地增加 ScheduledExecutorService 中可用的线程数。所以如果一个任务没有完成运行,执行器仍然可以运行一个新的。

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(10);

(我随机选择了 10 个 - 如果您每分钟运行一次任务,并且它最多可以运行 5 分钟,那么您就会有一些错误余地)

【讨论】:

    猜你喜欢
    • 2021-10-15
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 2013-11-09
    • 2020-10-30
    相关资源
    最近更新 更多