线程池概述

线程池是一个可以复用线程的技术,如果没有线程池,用户每发起一个请求,后台机会创建一个新线程来处理,下车新任务来了又要创建新线程,而创建新线程的开销很大,这样会严重影响系统的性能

线程池的工作原理

线程池中会有数个核心线程(工作线程),当有数个线程需要执行时,例如有3个核心线程,5个需要处理的线程那么,那么有三个线程会得到处理,剩下的两个在前面三个处理后才能得到线程对象
image.png

线程池实现的API,参数说明

怎么创建线程池对象

image.png
image.png
corePoolSize:核心线程数目
MaxmumPoolSize:核心线程数目+临时线程数目
KeepAliveTime:临时线程的最大存活时间(指的是临时线程最大空闲时间)
unit:临时线程的最大存活时间单位
workQueue:(任务队列)需要处理的线程数目超过MaxmumPoolSize剩余的线程存储的地方
ThreadFactory:用哪种方式创建线程
handler:当MaxmumPoolSize和workQueue全满时怎么处理新加入的线程

线程池什么时候创建临时线程

当核心线程忙,任务队列满,并且还可以创建临时线程是才会创建,这么做是为了资源利用率最大化,因为如果核心线程满,任务队列不满时创建临时线程会出现核心线程很快就有空处理任务队列中的任务了但是这时已经创建了临时线程这时就出现多消耗资源的情况

什么时候开始拒绝任务

核心线程和临时线程忙,任务队列满,这时有新任务才会开始拒绝任务

线程池处理Runnable任务

image.png
image.png

线程池处理Callable任务

image.png

Executors工具类实现线程池

image.png
第一个只有临时线程,临时线程数目不受控制,会报错
第二个只有核心线程,但是任务长度不限,任务过多会报错
第三个只有一个核心线程,但是任务长度不限,任务过多会报错
最后一个也是多个临时线程但是一般用来做延迟,临时线程数目不受控制,会报错
image.png
image.png