gpt4 book ai didi

Java scheduleAtFixedRate + Thread.sleep

转载 作者:行者123 更新时间:2023-12-03 12:58:48 26 4
gpt4 key购买 nike

我正在研究 Java 类 ScheduledExecutorService 的 scheduleAtFixedRate 方法。

这是我的可疑代码:


ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);

Runnable command = () -> {
System.out.println("Yo");
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
};

scheduledExecutorService.scheduleAtFixedRate(command, 0, 1, TimeUnit.SECONDS);

我预计每 1 秒 scheduledExecutorService 将尝试从池中获取新线程并启动它。

API says: "scheduledExecutorService creates and executes a periodic action that becomes enabled first after the given initial delay, and subsequently with the given period. /(unimportant deleted)/ If any execution of this task takes longer than its period, then subsequent executions may start late, but will not concurrently execute."

结果 - 每个新线程每 4 秒启动一次。

所以,问题:

  1. 有什么问题 - Thread.sleep() 是否会停止所有线程或此行为的细微差别 - “如果此任务的任何执行时间超过其周期,则后续执行可能会延迟开始,但不会同时执行“?

  2. 如果在这种情况下“不会同时执行”为真 - 如果每个线程都将在前一个线程执行后启动,为什么我们需要这个包含多个线程的池?

  3. 是否有任何使用 scheduleAtFixedRate 的简单有效示例,其中一个线程启动而前一个线程仍在执行?

最佳答案

  1. 答案在您提供的报价中。 Executor 等待任务完成,然后再次启动该任务。它阻止并发执行一个任务的多个实例——在大多数情况下需要这种行为。在你的情况下,Executor 启动一个任务,然后等待 1 秒的延迟,然后再等待 3 秒直到当前任务完成,然后才再次启动该任务(它不一定启动新线程,它可能在同一个线程中启动任务).

  2. 您的代码根本不使用线程池 - 您可以使用单线程执行器获得完全相同的结果。

  3. 如果你想获得这种行为:

    I expected that every 1 second scheduledExecutorService will try to take new thread from the pool and start it.

    那么你可以这样写:

    ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);

    Runnable command = () -> {
    System.out.println("Yo");
    try {
    Thread.sleep(4000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    };

    Runnable commandRunner = () -> {
    scheduledExecutorService.schedule(command, 0, TimeUnit.SECONDS);
    }

    scheduledExecutorService.scheduleAtFixedRate(commandRunner, 0, 1, TimeUnit.SECONDS);

    (最好创建一个运行 commandRunner 的单线程 ScheduledExecutorService 并创建一个基于线程池的 ExecutorServicecommandRunner 执行命令)

关于Java scheduleAtFixedRate + Thread.sleep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59962814/

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