繁体   English   中英

如何以固定的速率安排任务的持续时间长于该速率?

[英]How to schedule a task at fixed rate with a duration longer than the rate?

我正在尝试安排一个需要每秒运行约2.25秒的任务,因此我知道3个线程应该足以处理负载。 我的代码如下所示:

private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(4);
scheduler.scheduleAtFixedRate(new Streamer(), 0, 1000, TimeUnit.MILLISECONDS);

有趣的是,它的行为类似于scheduleAtFixedDelay,延迟为0(线程每〜2.25秒完成一次)。

我知道,如果线程延迟运行,则scheduleAtFixedRate可能会延迟。 但是,不应该给执行者更大的线程池来解决此问题吗?

我可以通过编码3个执行器每3秒启动一次来轻松解决该问题,但这会使管理变得不必要地困难。

有解决这个问题的简便方法吗?

您可以使用threadPool和Scheduler实现此效果:

  1. 创建一个fixedThreadPool(或满足您需求的其他线程),用4个线程说-线程数应基于单个任务执行所消耗的时间和计划任务的速率,基本上numberOfThreads = avgExecTimeOfSingleTaks *频率+ someMargin;

  2. 然后创建调度程序线程,即每隔一秒钟(或其他期望的时间)将作业添加到fixedThreadPool队列中,然后任务可以重叠。

解决问题的这种方式具有更多的优势:

如果您的任务开始耗时超过2.25秒,或者您想以更高的频率执行它们,那么您要做的就是向threadPool添加一些线程,而使用其他答案,则需要重新计算并重新安排所有时间。 因此,此方法为您提供了更清晰,更易于维护的方法。

ScheduledExecutor自动防止任务执行重叠。 因此,您的后续执行将延迟到上一个执行完成之后。

文件

“如果此任务的任何执行花费的时间超过其周期,那么后续执行可能会延迟启动, 但不会同时执行。

因此,您需要计划3个任务,其中1)InitDelay 0秒,2)InitDelay 1秒,3)InitDelay 2秒,每个任务的周期为3秒。

private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(4);
final Streamer sharedStreamer = new Streamer();
scheduler.scheduleAtFixedRate(sharedStreamer, 0, 3, TimeUnit.SECONDS);
scheduler.scheduleAtFixedRate(sharedStreamer, 1, 3, TimeUnit.SECONDS);
scheduler.scheduleAtFixedRate(sharedStreamer, 2, 3, TimeUnit.SECONDS);

请注意,如果有大部分同步代码,使用共享资源执行可能会导致执行时间延长。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM