【问题标题】:Java ScheduledExecutorService.scheduleWithFixedDelay starts new thread to execute the task without waiting for 1st task to completeJava ScheduledExecutorService.scheduleWithFixedDelay 启动新线程来执行任务而不等待第一个任务完成
【发布时间】:2019-03-27 09:12:54
【问题描述】:

我正在编写一段需要定期安排 Runnable 的代码。我正在使用 ScheduledExecutorService.scheduleWithFixedDelay,初始延迟为 0,延迟为 2 分钟。此 SchedulerService 中只有任务。我预计该任务的第二次执行将在第一次执行任务完成后 2 分钟开始。为了验证这一点,我在调试模式下启动了我的应用程序,并在可运行任务的开头放置了一个断点。第一次执行在断点处停止,执行任务的线程进入挂起状态。令我惊讶的是,在第一次执行任务开始 2 分钟后,SchedulerService 启动新线程来执行第二次执行任务。我期待除非第一次执行完成,否则 ScheduledExecutorService.scheduleWithFixedDelay 不会开始第二次执行。请帮助我理解这种行为,因为这与 Javadoc 对此方法的解释相矛盾。

【问题讨论】:

  • 请发布您的代码,以便人们可以查看它作为需要更改的建议。

标签: java scheduling


【解决方案1】:

线程数可控。可以启动单线程执行器。 ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();

【讨论】:

  • 不能使用这个,因为同一个 ScheduledService 最终会被多个组件共享。为了我的测试,我现在禁用了其他组件。
  • 调度程序服务的默认行为是以给定的时间间隔运行任务。它不会等到一个任务完成后才开始下一个任务。使执行程序单线程是处理此类行为的一种选择。如果不可能,您必须在任务级别处理它。尝试使用可完成的期货来处理这种行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多