gpt4 book ai didi

java - 我对ScheduledThreadPoolExecutor.scheduleAtFixedRate和可能的并发感到困惑。为什么会有线程池?

转载 作者:行者123 更新时间:2023-12-03 12:59:55 24 4
gpt4 key购买 nike

我的困惑是从the api description中的scheduleAtFixedRate方法的代码片段开始的。

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



如果没有并发执行,为什么会有线程池?

另外,有没有一种方法可以使并发执行?我希望它们在确切的时间运行,即使先前的任务尚未完成。我要并发执行。

最佳答案

该文档应阅读为:

..subsequent executions [of the supplied Runnable task, per registration] .. will not concurrently execute



这并不意味着所有计划的任务都不会并发。而是,对于每个任务(通过调用 scheduleAtFixedRate创建),Runnable一次仅在一个线程上执行-即使执行时间超出了间隔。

这是一个明确的设计选择,因为在大多数情况下,并发执行任务回调是不希望的,并且会导致失控的资源螺旋上升。例如,如果同时执行越来越多的(相同)Runnable,则可能形成“任务炸弹”。

线程池的绰号是准确的,因为该实现会执行其应做的事情-在任务执行过程中重用线程。

虽然没有标准的[Thread Pool]执行器具有所请求的行为,但是可以有限的方式对其进行仿真。这是因为并发限制是针对每个任务注册的(不是针对每个Runnable的),并且可以注册多个“相同”的任务:
long targetPeriod = ..;
long n = targetPeriod * 2;
task1 = executor.scheduleAtFixedRate(runnable, 0, n, ..)
task2 = executor.scheduleAtFixedRate(runnable, n/2, n, ..)

实际的执行/定时行为取决于各种其他因素,但是,如果这两个已注册的任务要花费〜n/2(目标时间段)来执行,则它们可以同时执行。

关于java - 我对ScheduledThreadPoolExecutor.scheduleAtFixedRate和可能的并发感到困惑。为什么会有线程池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35498179/

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