*
nicktming
前言
在开发过程中, 合理地使用线程池能够带来 3 个好处.
1. 降低资源消耗. 通过重复利用已创建的线程降低线程创建和销毁造成的消耗.
2. 提高响应速度. 当任务到达时, 任务可以不需要等到线程创建就能立即执行.
3. 提高线程的可管理性. 线程是稀缺资源, 如果无限制地创建, 不仅会消耗系统资源, 还会降低系统的稳定性, 使用线程池可以进行统一分配 调优和监控.
线程池的实现原理
ThreadPoolExecutor 中的执行流程
线程池流程. PNG
1. 线程池判断核心线程池里的线程是否都在执行任务. 如果不是, 则创建一个新的工作线程来执行任务. 如果核心线程池里的线程都在执行任务, 则进入下个流程.
2. 线程池判断工作队列是否已经满. 如果工作队列没有满, 则将新提交的任务存储在这个工作队列里. 如果工作队列满了, 则进入下个流程.
3. 线程池判断线程池的线程是否都处于工作状态. 如果没有, 则创建一个新的工作线程来执行任务. 如果已经满了, 则交给饱和策略来处理这个任务.
图片. PNG
1. 如果当前运行的线程少于 corePoolSize, 则创建新线程来执行任务.
2. 如果运行的线程等于或多于 corePoolSize, 则将任务加入 BlockingQueue.
3. 如果无法将任务加入 BlockingQueue(队列已满), 则创建新的线程来处理任务.
4. 如果创建新线程将使当前运行的线程超 maximumPoolSize, 任务将被拒绝, 并调用 RejectedExecutionHandler.rejectedExecution() 方法.
参考
1. Java 1.8 源码
2. Java 并发编程的艺术
来源: http://www.jianshu.com/p/ff9007419ab1