线程池
线程池
说说线程池的核心属性及处理流程?
线程池有下面几个核心的属性:
- corePoolSize 核心线程数
- maximumPoolSize 最大线程数
- queue 任务队列
其处理流程如下所示:
- 首先,当提交一个任务到线程池后,首先判断工作线程数是否小于核心线程数。如果小于核心线程数,那么直接添加工作线程并执行任务,直接结束。如果大于核心线程数,那么丢入阻塞任务队列。
- 接着,判断阻塞队列是否已满。如果阻塞队列未满,那么任务丢入队列,等待工作线程去消费,直接结束。如果阻塞队列已满,那么判断工作线程数是否达到线程上限。
- 接着,如果工作线程数达到上线,那么执行拒绝策略。否则,继续添加工作线程并执行任务。
- 最后,结束任务。
看完整个流程,我们大概可以提炼出其逻辑:
- 首先,不断增加工作线程数量,直到达到核心线程数。
- 接着,不断将任务丢入阻塞队列,直到阻塞队列满了。
- 接着,不断增加工作线程数量,直到达到最大线程数。
- 最后,如果达到最大线程数,阻塞队列又满了,就执行拒绝策略。