如果我一直往线程池里面放任务,会发生什么?

开发 前端
面试的时候最常问的就是线程池的各种参数的含义,和线程池的整个运行流程,这个一定要会。

 [[342356]]

线程池的各种参数

面试的时候最常问的就是线程池的各种参数的含义,和线程池的整个运行流程,这个一定要会

ThreadPoolExecutor一共有4个构造函数,但最后调用的都是如下构造函数

参数 含义
corePoolSize 核心线程池大小
maximumPoolSize 线程池最大容量大小
keepAliveTime 线程池空闲时,线程存活的时间
TimeUnit 线程活动保持时间的单位
BlockingQueue<Runnable> 任务队列,用于保存等待执行的任务的阻塞队列
ThreadFactory 用于设置线程的工厂
RejectedExecutionHandler 饱和策略

来类比学习一下这些参数,我们把线程池类比为项目组,线程是这个公司的成员

corePoolSize:线程池中最少的线程数,一个项目组总得有corePoolSize人坚守阵地,都是签订劳动合同了,不能随便撤。

maximumPoolSize:当项目很忙时,就得加人,请其他项目组的人来帮忙。但是公司空间有限,最多只能加到maximumPoolSize个人。当项目闲了,就得撤人了,最多能撤到corePoolSize个人

keepAliveTime & unit:上面提到项目根据忙闲来增减人员,那在编程世界里,如何定义忙和闲呢?如果一个线程在keepAliveTime(时间数字)* unit(时间单位)时间内都没有执行任务,说明这个线程很闲。如果此时线程数大于corePoolSize,这个线程就要被回收了

workQueue:就是任务队列

threadFactory:自定义如果创建线程,例如给线程指定一个有意义的名字

handler:workQueue满了(排期满了),再提交任务,该怎么处理呢?这个就是处理策略,线程池提供了4种策略,你也可以实现RejectedExecutionHandler接口来自定义策略

策略
AbortPolicy 丢弃任务,抛运行时异常(默认的处理策略)
CallerRunsPolicy 执行任务
DiscardPolicy 忽视,什么都不会发生
DiscardOldestPolicy 丢弃队列里最近的一个任务,并执行当前任务

线程池的工作流程

可以参照一下源码理解一下下面的流程

1.线程池刚创建时,里面没有一个线程。任务队列是作为参数传进来的。不过,就算队列里面有任务,线程池也不会马上执行他们。

2.当调用execute()方法添加一个任务时,线程池会做如下判断:

a. 如果正在运行的线程数量小于corePoolSize,那么马上创建线程运行这个任务

b. 如果正在运行的线程数量大于或等于corePoolSize,那么将这个任务放入队列

c. 如果这时候队列满了,而且正在运行的线程数量小于maximunPoolSize,那么还是要创建非核心线程立刻运行这个任务

d. 如果队列满了,而且正在运行的线程数量大于或等于maximunPoolSize,那么线程池会抛出RejectedExecutionException

3.当一个线程完成任务时,它会从队列中取下一个任务来执行

4.当一个线程无事可做,超过一定的时间(keepAliveTime)时,线程池会判断,如果当前运行的线程数大于corePoolSize,那么这个线程就被停掉。所以线程池的所有任务完成后,它最终会收缩到corePoolSize的大小

可以用如下图来表示整体流程

本文转载自微信公众号「 Java识堂」,可以通过以下二维码关注。转载本文请联系 Java识堂公众号。

 

 

责任编辑:武晓燕 来源: Java识堂
相关推荐

2022-08-16 13:41:24

稳定币加密世界攻击

2023-05-15 10:27:53

人工智能AI

2021-12-27 08:24:08

漏洞网络安全

2021-08-19 17:27:41

IT数据中心灾难

2021-12-08 12:05:21

MySQ磁盘数据库

2022-05-23 14:57:36

加密货币比特币投资

2020-05-11 08:36:21

程序员工作生活

2020-06-08 15:15:26

程序员摆地摊技术

2016-04-08 15:13:29

人工智能阿里小Ai

2023-08-26 07:44:13

系统内存虚拟

2021-03-10 10:40:04

Redis命令Linux

2023-06-27 16:53:50

2015-09-25 10:41:48

r语言

2020-12-16 19:26:42

IIOTIOT工业物联网

2012-12-25 15:19:20

Windows操作系统

2019-03-14 11:00:40

GoLua语言

2011-10-11 15:42:54

大数据数据库

2024-09-12 09:34:32

2023-04-27 07:40:08

Spring框架OpenAI

2015-04-16 10:40:29

点赞
收藏

51CTO技术栈公众号