gpt4 book ai didi

java - Java中一个线程池的核心线程为什么不能在初始阶段复用?

转载 作者:行者123 更新时间:2023-12-03 11:19:27 25 4
gpt4 key购买 nike

我最近在查看 的源代码时遇到了一个问题。线程池执行器 : 如果线程池代表重用已有线程来减少线程创建或销毁的开销,那为什么不在初始阶段重用核心线程呢?即当当前线程数小于核心线程数时,首先检查是否有核心线程完成了任务,如果有,则重用。为什么不?而不是在达到核心线程数之前创建新线程,这是否违反了线程池设计原则?
下面是对ThreadPoolExecutor中addWorker()方法的部分注释

  • @param firstTask the task the new thread should run first (or null if none). Workers are created with an initial first task (in method execute()) to bypass queuing when there are fewer than corePoolSize threads (in which case we always start one), or when the queue is full (in which case we must bypass queue). Initially idle threads are usually created via prestartCoreThread or to replace other dying workers.

最佳答案

这实际上已经被要求了:JDK-6452337 .一位核心库开发人员指出:

I like this idea, but ThreadPoolExecutor is already complicated enough.


请记住, corePoolSizeThreadPoolExecutor 的重要组成部分并说至少有多少 worker 始终处于 Activity 状态/空闲状态。达到这个数字自然需要很短的时间。您设置 corePoolSize根据您的需求,预计工作量将满足此数字。
我的假设是优化这个“热身阶段”——理所当然地认为这实际上会提高效率——是不值得的。我无法为您量化这种优化会带来什么额外的复杂性,我不是在开发 Java 核心库,但我认为这不值得。
您可以这样想:“预热阶段”是恒定的,而线程池将运行不确定的时间。在理想的世界中,初始阶段实际上根本不需要时间,工作负载应该在您创建线程池时就在那里。因此,您正在考虑优化不是预期线程池状态的内容。
无论如何,都必须在某个时候创建​​线程 worker 。这种优化只会延迟创建。假设你有一个 corePoolSize 10 个,所以至少有创建 10 个线程的开销。如果你稍后再做,这个开销不会改变。是的,稍后也会占用资源,但在这里我首先询问线程池是否配置正确:是 corePoolSize正确,它是否满足当前的工作量?
请注意 ThreadPoolExecutor有类似 setCorePoolSize(int) 的方法和 allowCoreThreadTimeOut(boolean) 以及更多允许您根据需要配置线程池的功能。

关于java - Java中一个线程池的核心线程为什么不能在初始阶段复用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65230801/

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