了解ScheduledThreadPoolExecutor

问题描述 投票:2回答:1

由于各种原因,我知道必须使用此名称而不是java.util.Timer。因此,为了研究这一点,我正在研究文档,并且我有几个问题:

  1. scheduleWithFixedDelay()如何工作? 我的理解是:它在给定的延迟后首先执行任务。任务完成后,它将等待指定的时间,然后再次执行任务。
  2. [我向scheduleAtFixedRate()提交任务要花比指定的延迟多得多的时间会发生什么?就像我希望任务每5秒执行一次,但需要10秒才能完成。 我的理解是,该任务将被保留在队列中,并且在有核心线程可用时将被执行
  3. [这是我对scheduleWithFixedDelay()scheduleAtFixedRate()有何不同的理解:scheduleWithFixedDelay()等待任务完成执行,等待指定的时间,然后再次触发任务,因为scheduleAtFixedRate将继续触发任务无需关心是否已完成。 正确?
java multithreading threadpool scheduledexecutorservice
1个回答
4
投票
  1. 正确。
  2. 不完全是。如果固定速率的任务花费的时间超过其周期,则它将在完成后立即再次运行,但是下一次运行不会等待线程。见下文。
  3. 固定速率任务does就像固定延迟任务一样,关心其先前的运行是否已完成。根据documentation,“如果此任务的任何执行花费的时间超过其周期,则后续执行可能会延迟启动,但不会同时执行。”

这样想:

  • 对于固定延迟任务,您指定一个时间段,该时间段将是两次运行之间的时间[。任务的实际持续时间对延迟没有影响。
  • 对于固定速率的任务,您指定一个时间段,该时间段将是两次运行之间的
  • 最大
  • 时间。如果任务的实际持续时间长于周期,则速度会降低,并且实际上没有延迟。
© www.soinside.com 2019 - 2024. All rights reserved.