线程池简介
这篇文章写的好。放个连接,是一个非常好的阅读材料。
美团技术团队:https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html
线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。
线程池的重要性
如果不使用线程池,每个任务都新开一个线程处理。
1.一个线程
2.for循环创建线程
3.1000个线程 这种方式开销太大,我们希望有固定数量的线程,来执行这个1000个任务,这样 就避免了反复创建并销毁线程所带来的开销问题。
为什么使用线程池?
1.反复创建线程开销大 2.过多的线程占用太多内存
解决方法: 1.用少量的线程–减少内存占用 2.让这部分线程始终保持工作状态,且可以反复执行任务—避免生命周期的损耗
线程池的好处: 1.加快响应速度 2.合理利用CPU和内存 3.统一管理资源
线程池的一些应用场景: 1.服务器接收到大量请求时,使用线程池技术是非常适合的,它可以大大减少 线程的创建和销毁次数,提高服务器的工作效率。 2.实际上,在开发中,如果需要创建5个以上的线程,那么久可以使用线程池来管理。
创建线程池
线程池构造函数的参数
corePoolSize
corePoolSize是核心线程数:线程池在完成初始化后,默认情况下,线程池中并没有任何线程,线程池会等待有任务到来时,再创建新线程去执行任务
maxPoolSize
线程池有可能会在核心线程数的基础上,再额外添加一些线程,只有在线程数小于maxPoolSize时才能在corePoolSize基础上新增线程。
添加线程的规则
1.如果currentThread < corePoolSzie,即使其他工作线程处于空闲状态,也会创建一个新线程来运行新任务。
2. 如果currentThread >= corePoolSize && currentThread < maxPoolSize,则将任务放入queue。
3. 如果queue已满,并且currentThread < maxPoolSize, 则创建一个新线程来运行任务。
4. 如果queue满,currentThread达到最大线程数,则执行拒绝执行策略。