我正在尝试安排一个每秒运行大约 2.25 秒的任务。因此我知道 3 个线程应该足以处理负载。我的代码如下所示:
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(4);
scheduler.scheduleAtFixedRate(new Streamer(), 0, 1000, TimeUnit.MILLISECONDS);
有趣的是,它的行为类似于 ScheduledAtFixedDelay,延迟为 0(线程每约 2.25 秒完成一次)。
我知道,如果线程运行延迟,scheduleAtFixedRate 可能会延迟。但是给执行器更大的线程池不应该解决这个问题吗?
我可以通过编写 3 个执行程序每 3 秒启动一次来轻松规避这个问题,但这会给管理带来不必要的困难。
有没有更简单的解决方案来解决这个问题?
ScheduledExecutor 自动防止任务执行重叠。因此,您的后续执行将被延迟,直到上一个执行完成后。
Docs:
“如果此任务的任何执行时间超过其周期,则后续执行可能会延迟开始,但不会同时执行。"
所以你需要安排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);
请注意,如果存在大部分同步代码,则使用共享资源执行可能会导致执行时间延长。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)