一、ThreadPoolExecutor构造方法
/**
* 参数1:创建线程池数量
* 参数2:最大线程池数量
* 参数3:空闲线程存活时间
* 参数4:空闲线程存活时间单位
* 参数5:阻塞队列
* 参数6:线程策略
*/
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
5,
200,
20,
TimeUnit.SECONDS,
new LinkedBlockingDeque<>(10000),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy()
);
运行流程
- 1、线程池创建,准备好core数量的核心线程,准备接受任务
- 2、core满了,就将再进来的任务放入阻塞队列中。空闲的core就会自己去阻塞队列获取任务来执行
- 3、阻塞队列满了,就直接开新线程执行,最大只能开到 max 指定的数量
- 4、max都执行好了。Max-core数量空闲的线程会在 keepAliveTime 指定的时间后自动销毁。最终保存到core大小
- 5、如果线程数开到了 max 的数量,还有新任务进来,就会使用 reject 指定的拒绝策略进行处理
- 6、所有的线程创建都是由指定的 factory 创建的
- new LinkedBlockingDeque<>():默认是 Integer 的最大值。会造成内存不够
二、为何要使用线程池
降低资源的消耗
- 通过重复利用已经创建好的线程来降低线程的创建和销毁带来的损耗
提高响应速度
- 因为线程池中的线程数没有超过线程池的最大上限时,有的线程处于等待分配任务的状态,当任务来时无需创建新的线程就能执行
提高线程的可管理性
- 线程池会根据当前系统特点对池内的线程进行优化处理,减少创建和销毁线程带来的系统开销。无限的创建和销毁线程不仅消耗系统资源,还降低系统的稳定性,使用线程池进行统一分配。
网友评论