合理利用线程池能够带来三个好处
- 降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗
- 提高响应速度,当任务到达时,任务可以不需要的等到线程创建就能立即执行
- 提高线程的可管理性,线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控
线程池的处理流程如下
- 首先线程池判断基本线程池是否已满?没满,创建一个工作线程来执行任务。满了,则进入下个流程
- 其次线程池判断工作队列是否已满?没满,则将新提交的任务存储在工作队列里。满了,则进入下个流程
- 最后线程池判断整个线程池是否已满?没满,则创建一个新的工作线程来执行任务。满了,则交给饱和策略来处理这个任务
线程池的创建
- 代码
1 | |
- 参数介绍
1 | |
线程池不允许使用Executors去创建
- 线程池不允许使用
Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险
Executors各个方法的创建线程池的弊端
newFixedThreadPool和newSingleThreadExecutor的主要问题是堆积的请求处理队列可能会耗费非常大的内存newCachedThreadPool和newScheduledThreadPool的主要问题是线程数最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程
线程池创建方式(根据阿里巴巴Java开发规范,推荐了3种线程池创建方式)
方式一
- 代码
1 | |
方式二
- 代码
1 | |
- 推荐工具类
1 | |
方式三
- Spring配置线程池方式:自定义线程工厂Bean需要实现ThreadFactory,使用方式直接注入Bean后使用
- 代码
1 | |
参考
- ThreadPoolExecutor线程池不允许使用Executors创建:https://blog.csdn.net/fly910905/article/details/81584675
推荐
- 为什么不推荐通过Executors直接创建线程池:https://blog.csdn.net/u010321349/article/details/83927012
- ThreadPoolExecutor使用详解:https://www.cnblogs.com/zedosu/p/6665306.html
- Java并发编程线程池的使用:http://www.cnblogs.com/dolphin0520/p/3932921.html