gpt4 book ai didi

java - 如果调用 ScheduleWithFixedDelay 方法的次数超过池大小,ScheduledExecutorService 如何工作?

转载 作者:行者123 更新时间:2023-12-02 10:50:47 29 4
gpt4 key购买 nike

在此代码中,我创建了带有 5 个线程池的 ScheduledExecutorService并调用 scheduleWithFixedDelay 方法 5 次。它将创建 5 个调度程序,每个调度程序将每隔几秒调用 testBean::test :

@PostConstruct
public void hz() {
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5, new ThreadPoolTaskScheduler());
for (int i = 0; i < 5; i++) {
scheduledExecutorService.scheduleWithFixedDelay(testBean::test, 1, 1, TimeUnit.SECONDS);
}
}

但我有一些问题。

  1. 我是否正确理解ScheduledExecutorService只是java接口(interface)和ThreadPoolTask​​Scheduler() - 是spring i,plementation?

  2. 它是否存在 spring 模拟而不是 ScheduledExecutorService

  3. 最重要的问题。如果我尝试调用 scheduleWithFixedDelay 方法的次数多于 ScheduledExecutorService 中池的次数(例如 9 次),会发生什么?:

@PostConstruct
public void hz() {
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5, new ThreadPoolTaskScheduler());
for (int i = 0; i < 9; i++) {
scheduledExecutorService.scheduleWithFixedDelay(testBean::test, 1, 1,

TimeUnit.SECONDS); } }

最佳答案

简单的回答是,您提交的任何计划任务都会在线程池的全局队列中优先排队(基于其应该运行的时间)。然后各个线程拾取任务并按顺序执行它们。因此,在您的情况下,在 t=1 时,池中的 5 个线程将从队列中选取 5 个项目并并行执行它们。当他们完成执行时,接下来的 4 个项目将在 time=(1 + 执行回调函数所需的时间) 时被选取。因此,除非您的回调函数占用线程几秒钟,否则所有 9 个计划任务应该大约在 t=1 时执行。

关于java - 如果调用 ScheduleWithFixedDelay 方法的次数超过池大小,ScheduledExecutorService 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52198914/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com