gpt4 book ai didi

java - newSingleThreadScheduledExecutor 的工作,如果线程已经忙

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:40:32 24 4
gpt4 key购买 nike

我的要求是制作一个服务,在特定时间间隔后继续检查队列并处理队列中的元素。

为了在 10 秒后安排任务,我使用:

ScheduledExecutorService schd = Executors.newSingleThreadScheduledExecutor();
schd.scheduleAtFixedRate(readQueueRunnable, 10, 10, TimeUnit.SECONDS);

我的问题是假设第一次,队列中有很多元素,我的单线程开始处理队列。

即使在 10 秒后,我的第一个线程仍在执行它。

那么当10秒后再次调用runnable时,是否会停止上一个正在执行的线程并启动新线程。或者,它将检查线程是否已经在运行,如果它正在运行,那么在这种情况下它将跳过进入 Runnable。

最佳答案

newSingleThreadScheduledExecutor(); 创建一个具有单个线程的执行器,该线程永远不会与自身并行执行任何操作。单个线程一次不能执行超过 1 件事。

如果您的任务花费的时间超过所需的 10 秒,它会在完成后将自己放回任务队列中以立即执行,因为目标时间已经过去。

任务不会早于指定的时间执行,但它总是可以稍后执行。

执行者也会 try catch 指定的速率。如果它需要在调用 scheduleAtFixedRate 后的 10 秒、20 秒和 30 秒执行任务,如果在此之前一直很忙,它将背靠背地运行它们。

持续花费比期望速度更长的重复任务将有效地减慢速度并且永远赶不上。

如果您的任务平均花费的时间少于该速率,那么您执行任务的次数将与速率规定的完全一样。

So when after 10 seconds, runnable is called again, will it stop the previous executing thread and start the new one.

Executors 重新使用它们的线程,它们会在它们的线程中按顺序执行您给它们的所有 Runnable。执行者也不会仅仅因为它花费的时间太长而试图停止或中断正在运行的任务。

Or, it will check if thread is already running & if it is running then it will skip going inside Runnable in that case.

没有。您可以提前计算固定速率任务执行时间应该是什么时候,执行者将尝试实现该目标。如果目标时间已经过去,它将尽快运行。

documentation像这样解释

If any execution of this task takes longer than its period, then subsequent executions may start late, but will not concurrently execute.

“非并发”部分适用于具有多个线程的执行程序。此处不相关,因为那不可能发生。


如果您希望 任务之间始终有 10 秒的延迟,请使用 scheduleWithFixedDelay

使用 scheduleAtFixedRate 时,当某些执行时间比周期长时,您可以看到延迟任务的背靠背执行,这通常是不希望的。

例子:第一次执行需要25秒,以后每次执行只需要1秒。你最终会得到:

  • 在 0s - 第一次准时执行
  • 在 25s - 2nd 意味着在 10s 运行
  • 在 26s - 第 3 意味着在 20s 运行
    • (停顿 3 秒)
  • 30s - 再次准时第 4

如果您使用 scheduleWithFixedDelay 并将延迟设置为 10 秒,您最终会得到

  • 在 0s - 1st for 25s
    • (停顿 10 秒)
  • 在 35 秒时 - 1 秒时获得第二名
    • (停顿 10 秒)
  • 46 秒 - 1 秒第三名
    • (停顿 10 秒)
  • 在 57 秒 - 1 秒时获得第 4 名

关于java - newSingleThreadScheduledExecutor 的工作,如果线程已经忙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21436761/

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