写在前面
首先感谢大家在盖楼的间隙阅读本篇文章,通过阅读本篇文章你将了解到:
- 线程池的定义
- Executors创建线程池的几种方式
- ThreadPoolExecutor对象
- 线程池执行任务逻辑和线程池参数的关系
- Executors创建返回ThreadPoolExecutor对象
- OOM异常测试
- 如何定义线程池参数
如果只想知道原因可以直接拉到总结那
线程池的定义
管理一组工作线程。通过线程池复用线程有以下几点优点:
- 减少资源创建 => 减少内存开销,创建线程占用内存
- 降低系统开销 => 创建线程需要时间,会延迟处理的请求
- 提高稳定稳定性 => 避免无限创建线程引起的OutOfMemoryError【简称OOM】
Executors创建线程池的方式
根据返回的对象类型创建线程池可以分为三类:
- 创建返回ThreadPoolExecutor对象
- 创建返回ScheduleThreadPoolExecutor对象
- 创建返回ForkJoinPool对象
本文只讨论创建返回ThreadPoolExecutor对象
ThreadPoolExecutor对象
在介绍Executors创建线程池方法前先介绍一下ThreadPoolExecutor,因为这些创建线程池的静态方法都是返回ThreadPoolExecutor对象,和我们手动创建ThreadPoolExecutor对象的区别就是我们不需要自己传构造函数的参数。ThreadPoolExecutor的构造函数共有四个,但最终调用的都是同一个:
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
构造函数参数说明:
- corePoolSize => 线程池核心线程数量
- maximumPoolSize => 线程池最大数量
- keepAliveTime => 空闲线程存活时间
- unit => 时间单位
- workQueue