首页 > 编程语言 >java 线程池为什么设计成先进队列再创建最大线程为何先入队列再增加线程数?

java 线程池为什么设计成先进队列再创建最大线程为何先入队列再增加线程数?

时间:2024-12-28 16:25:51浏览次数:7  
标签:java 队列 创建 任务 线程 核心 系统资源

java 线程池为什么设计成先进队列再创建最大线程为何先入队列再增加线程数?

这个设计与 线程池的性能优化资源利用任务调度策略密切相关。要理解为什么线程池设计成“ 先将任务入队列,再创建最大线程数 ”,可以从以下几个方面进行分析:


1. 线程创建的开销较高

  • 线程资源昂贵 :创建一个线程需要分配内存、初始化栈空间、注册线程信息等,这些操作会带来较高的系统开销。
  • 系统资源有限 :线程过多会导致系统资源被大量消耗,可能引起上下文切换频繁,从而影响系统性能。

设计目的 :线程创建和销毁的开销。

  • 如果线程池中的 核心线程 (corePoolSize)已经足够处理任务,则不需要创建额外线程。

2. 任务队列能够提高系统吞吐量

  • 任务入队列 :将新任务放入 阻塞队列 (如 LinkedBlockingQueueArrayBlockingQueu
  • 通过 复用现有线程 (核心线程)来尽可能减少
  • e)时,现有的空闲线程会去取任务执行,复用空闲线程的能力得到最大化。
  • 线程执行效率更高 :减少线程频繁创建和销毁所带来的性能损耗,可以让线程池专注于任务执行。

设计逻辑

  • 当任务量不大时,线程池优先将任务放入队列,核心线程逐个执行, 不会浪费资源创建过多的线程
  • 只有当队列满了,才会继续创建新的线程来处理任务。

3. 避免无意义地增加线程数

假设线程池的逻辑是“ 任务来临时先创建新的线程而非入队列 ”,这会带来以下问题:

  • 线程数快速膨胀 :任务较多时,每来一个任务都会创建一个线程,系统资源会迅速消耗殆尽。
  • 上下文切换开销大 :大量线程并发时,CPU 需要频繁切换线程上下文,反而会降低系统吞吐量。

优先入队列可以确保:

  • 在任务负载较轻的情况下, 任务在队列中排队等待执行 ,避免了不必要的线程创建。
  • 只有在负载较重、队列已满的情况下,才创建额外线程来缓解压力。

4. 遵循合理的线程池执行策略

Java 线程池设计中的默认执行策略为 先入队列再增加线程数 ,遵循以下执行流程:

  1. 小于核心线程数 (corePoolSize):创建新的线程执行任务。
  2. 核心线程已满 :任务进入队列(如阻塞队列)。
  3. 队列已满 :创建新的线程,直到达到最大线程数(maximumPoolSize)。
  4. 超过最大线程数 :任务根据拒绝策略(RejectedExecutionHandler)处理。

这种设计充分利用了核心线程 + 任务队列的组合优势:

  • 核心线程能够提供稳定的任务处理能力。
  • 任务队列可以缓冲任务,减少线程创建开销。
  • 最大线程数作为应急保障,当队列压力过大时提供额外的处理能力。

5. 总结:优先入队列再扩充线程的原因

  • 资源优先级 :优先复用核心线程,最大化已有线程的利用率。
  • 性能考虑 :任务队列减少线程频繁创建和销毁带来的开销。
  • 吞吐量优先 :线程过多会导致 CPU 上下文切换增加,从而降低吞吐量。
  • 保护系统资源 :线程数增长受控,避免资源耗尽。

设计哲学

  • 能用核心线程处理,就不用额外线程
  • 能用任务队列缓冲,就不急着扩充线程

这体现了线程池的核心目标: 高效利用线程,平衡系统资源与性能

标签:java,队列,创建,任务,线程,核心,系统资源
From: https://blog.csdn.net/dzend/article/details/144777881

相关文章

  • 基于Java+SpringBoot的闲置图书分享系统
    关注底部领取源码源码编号:S404源码名称:基于SpringBoot的闲置图书分享系统用户类型:双角色,用户、管理员主要技术:Java、Vue、ElementUl、SpringBoot运行环境:Windows/Mac、JDK1.8及以上运行工具:IDEA/Eclipse数 据 库:MySQL5.7及以上版本数据库表数量:12张表是否有毕业......
  • 4.采用锁操作并支持等待功能的线程安全队列
    分析书接上文修改push()似乎并不困难:在函数末尾加上对data_cond.notify_one()的调用即可,与代码清单1(第一篇文章)一样。事情其实没那么简单,我们之所以采用精细粒度的锁,目的是尽可能提高并发操作的数量。如果在notify_one()调用期间,互斥依然被锁住,形式与代码清单1一样,而等......
  • java命令行参数与选项
    https://cloud.tencent.com/developer/article/1018405https://www.cnblogs.com/limeiyang/p/16565920.htmlhttps://cloud.tencent.com/developer/article/2363703https://www.cnblogs.com/xy14/p/11563830.htmlJava命令行参数用于启动Java程序,并可以通过这些参数来控制Ja......
  • Javascript数据结构常见题目(一)
    以下是每个问题的JavaScript实现:1.下一个更大元素(循环数组)functionnextGreaterElements(nums){letn=nums.length;letresult=Array(n).fill(-1);letstack=[];for(leti=0;i<2*n;i++){letnum=nums[i%n];......
  • Javascript数据结构常见面试题目(全)
    以下是一个前端JavaScript数据结构常见题目框架,可以帮助你快速组织思路并解决问题:框架内容1.数组相关查找与排序:寻找数组的最大/最小值。快速排序、归并排序、冒泡排序。操作:移除重复项:newSet()或双指针法。滑动窗口法:求最大/最小子数组和。二分查找:查找有序数......
  • Java中三大构建工具的发展历程(Ant、Maven和Gradle)
    ......
  • 记手动粗浅管理多线程的工具类
    首先新建一个线程池管理工具类ThreadPoolManagerUtilimportlombok.extern.slf4j.Slf4j;importjava.util.concurrent.ArrayBlockingQueue;importjava.util.concurrent.ConcurrentHashMap;importjava.util.concurrent.ThreadFactory;importjava.util.concurrent.ThreadP......
  • 人才公寓系统|Java|SSM|JSP|
                  【技术栈】1⃣️:架构:B/S、MVC2⃣️:系统环境:Windowsh/Mac3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7+4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、JSP、jquery,html5⃣️数据库可视化工具:navicat6⃣️服务器:SpringBoot自带apachetom......
  • 考研互学互助系统|Java|SSM|VUE| 前后端分离
                 【技术栈】1⃣️:架构:B/S、MVC2⃣️:系统环境:Windowsh/Mac3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7+4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html5⃣️数据库可视化工具:navicat6⃣️服务器:SpringBoot自带apachetomcat......
  • ExpDemo-JavaFX打造属于你自己的图形化漏洞利用工具
    声明!本文章所有的工具分享仅仅只是供大家学习交流为主,切勿用于非法用途,如有任何触犯法律的行为,均与本人及团队无关!!!目录标题前言编写属于你的图像化漏洞利用工具项目结构编写EXP部署部署启动启动前言这是一个构建图形化漏洞利用的一个项目,已经写好架子,只需要往里......