作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近在查看 的源代码时遇到了一个问题。线程池执行器 : 如果线程池代表重用已有线程来减少线程创建或销毁的开销,那为什么不在初始阶段重用核心线程呢?即当当前线程数小于核心线程数时,首先检查是否有核心线程完成了任务,如果有,则重用。为什么不?而不是在达到核心线程数之前创建新线程,这是否违反了线程池设计原则?
下面是对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.
corePoolSize
是
ThreadPoolExecutor
的重要组成部分并说至少有多少 worker 始终处于 Activity 状态/空闲状态。达到这个数字自然需要很短的时间。您设置
corePoolSize
根据您的需求,预计工作量将满足此数字。
corePoolSize
10 个,所以至少有创建 10 个线程的开销。如果你稍后再做,这个开销不会改变。是的,稍后也会占用资源,但在这里我首先询问线程池是否配置正确:是
corePoolSize
正确,它是否满足当前的工作量?
ThreadPoolExecutor
有类似
setCorePoolSize(int)
的方法和
allowCoreThreadTimeOut(boolean)
以及更多允许您根据需要配置线程池的功能。
关于java - Java中一个线程池的核心线程为什么不能在初始阶段复用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65230801/
我是一名优秀的程序员,十分优秀!