java - java-ThreadPool-当线程数小于corePoolSize时,为什么要创建一个新线程而不是使用现有线程?
问题描述
假设在execute()方法中提交了一个新任务,为什么在线程数小于corePoolSize的情况下创建一个新线程而不是使用现有线程?
public static void main(String[] args) {
ThreadPoolExecutor service = new ThreadPoolExecutor(2, 5, 10L,
TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
try {
for (int i = 0; i < 8; i++) {
service.execute(() -> {
System.out.println(Thread.currentThread().getName());
});
}
} finally {
service.shutdown();
}
}
我在网上得到了这个问题。这是对的吗?并请告诉我原因。
解决方案
仅当您了解文档的这一部分时,该问题才有意义:
核心和最大池大小
[...] 当在 method 中提交新任务
execute(Runnable)
并且运行的线程少于corePoolSize
线程时,即使其他工作线程处于空闲状态,也会创建一个新线程来处理请求。[...]
问题是,为什么不使用空闲的工作线程呢?
因为我们不知道是否有任何线程处于空闲状态。
只有线程自己知道这一点,所以我们必须遍历所有线程来检查是否有空闲线程,当我们可以启动一个新线程并使线程池达到其核心大小时,这太昂贵了。
仅供参考:您必须查看源代码才能了解ThreadPoolExecutor
这一点。
推荐阅读
- python - 具有多个输入但只有一个预测变量的 Lmfit 回归
- docker - Docker 上的 Sonarqube 在 Ubuntu 20.04.1 LTS 上消耗过多内存
- php - 如何使用 Json RPC 连接到其他非 BTC 的加密节点
- javascript - 替换除and之外的大多数元素
- c++ - `float* const* ` 是什么意思?
- python - 无法从“pandas.core.computation.check”Google Collab 导入名称“_NUMEXPR_INSTALLED”
- sql - 从表值参数将数据插入表中
- javascript - 如何将 svg 文件用作复选框?
- c++ - Windows / MSVC上的C ++中的浮点异常?
- python - `pyenv global xyz`和`pyenv shell xyz`有什么区别?