gpt4 book ai didi

java - 为什么 ScheduledThreadPoolExecutor 的队列大小总是 0?

转载 作者:行者123 更新时间:2023-11-30 07:54:35 29 4
gpt4 key购买 nike

我正在使用 ScheduledThreadPoolExecutor 每毫秒安排一个任务。据我了解,ScheduledThreadPoolExecutor 在内部使用无界队列,并在没有线程可用于执行任务时追加任务。

因此,我会做出以下假设:如果我有一个具有单线程的执行程序,并且定期运行的任务花费的时间比计划的频率长,那么队列大小会不断增加。尽管对于我的以下最小代码示例,这似乎并不正确:

import java.util.concurrent.{ScheduledThreadPoolExecutor, TimeUnit}

object MinimalExample {

val numberOfThreads = 1
val executor = new ScheduledThreadPoolExecutor(numberOfThreads)

def execute(): Unit = {
val thread = new TestThread(executor)
val initialDelay = 0
val interval = 1
executor.scheduleAtFixedRate(thread, initialDelay, interval, TimeUnit.MILLISECONDS)
}

def main(args: Array[String]): Unit = {
execute()
}
}

class TestThread(executor: ScheduledThreadPoolExecutor) extends Runnable {
override def run(): Unit = {
Thread.sleep(2000)
println("just slept 2 seconds")
println(s"queue size: ${executor.getQueue().size()}")
}
}

队列的大小总是打印 0。如果任务需要超过 2 秒并且每毫秒安排一次,那怎么可能呢?我错过了什么吗?

最佳答案

当周期性任务正在执行时,它会从内部队列中移除(take()-n 或 poll()-ed)。当任务成功完成后,它会在稍后重新添加。 (如果它抛出异常,则不会。)这适用于 scheduleWithFixedDelayscheduleAtFixedRategetQueue 返回等待执行的任务的内部队列。该队列还包含等待延迟到期的延迟任务,但不包含当前正在执行的任务。 (使用 getActiveCount 查询。)

scheduleAtFixedRate 引用 javadoc:

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

这是通过仅在执行后将周期性任务重新添加到队列中来完成的。任务本身在执行期间不会出现在队列中,也永远不会出现在队列中多次。

关于java - 为什么 ScheduledThreadPoolExecutor 的队列大小总是 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43983993/

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