网站首页 > 文章精选 正文
我们首先看下线程池的构造方法,如图1示:
- corePoolSize:核心数,不管什么时候线程数都不小于corePoolSize
- maximumPoolSize:最大线程数
- keepAlivetime:空闲线程存活时间
- unit:空闲线程存活时间单位
- workQueu:阻塞队列
- threadFactory:线程工厂,主要是用于创建线程,可以指定线程名称,组等
- handler:拒绝策略
线程池的底层执行原理如图2所示:
- 线程池启动,创建corePoolSize的线程数组
- 若当前任务数大于corePoolSize时,将runnable任务push到队列中
- 若当前队列满了,仍然有任务进来则判断当前线程数是否大于maximumPoolSize,不大于则创建线程
- 若当前线程数等于maximumPoolSize,仍然有任务进来则执行拒绝策略。
我们重点看第三步,为啥是等线程队列满了再创建,而不是一开始任务大于corePoolSize时就创建呢。我举个例子就明白了,比如一个工厂有10个工人,一般情况下10个工人工作量刚刚饱和,这时工厂突然接了大批订单,而工厂只有10个人,老板为了节约成本,让那10个人加班,做不完的线挤压。但是虽然时间越来越长,工人的抱怨情绪越来越多,最后老板顶不住了就在外边找几个临时工来缓解工人们的压力。通过这个例子,我们可以得出老板的目的是为了节约成本,那么反观线程池呢,我们都知道大部分情况下线程池中的任务都不是很多的,若当任务量大于corePoolSize时就创建线程,会造成什么现象呢?CPU会忙于创建线程、销毁线程,浪费了cpu、内存,所以呢,线程池为了减轻cpu、内存的压力,当队列满的时候再创建线程。
- 上一篇: RocketMQ中的线程池是如何创建的?
- 下一篇: Java 如何创建线程池
猜你喜欢
- 2025-01-02 Socket与TCP协议,利用python打造一个多人聊天室
- 2025-01-02 探讨C语言系统编程中线程的原理以及实现
- 2025-01-02 ffmpeg播放器实现详解 - 创建线程
- 2025-01-02 互联网面试-Java中如何去创建一个线程池?
- 2025-01-02 一篇详解内核监控进程与线程创建
- 2025-01-02 Python多线程,线程与进程的区别,线程模块及线程的两种创建方式
- 2025-01-02 正确使用线程池的姿势,你在工作中不要只会使用默认的方式创建
- 2025-01-02 Java线程池的正确创建方式
- 2025-01-02 [编程基础] C++多线程入门1-创建线程的三种不同方式
- 2025-01-02 Qt多线程创建
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)