Java线程池ThreadPoolExecutor源码快速理解

理解源码一个大概,再逐渐深入每一个细节

1、往线程池里提交任务时,什么情况下会启动线程,什么情况下会往阻塞队列里放任务

2、线程启动之后,它在做什么,线程怎么从队列里取任务

3、线程空闲之后,为什么线程被阻塞了

创建线程池

Java线程池ThreadPoolExecutor源码快速理解_第1张图片

这个没什么可说明的,要使用线程池,这些参数必须熟悉

往线程池里添加任务

Java线程池ThreadPoolExecutor源码快速理解_第2张图片

往线程池里添加任务时,是否启动新线程,还是往队列里扔任务,主要跟这几个参数相关:

  1. 当前已经启动的线程数量,从workerCountOf方法返回
  2. 核心线程数量
  3. 队列是否满

启动线程 

Java线程池ThreadPoolExecutor源码快速理解_第3张图片

这段代码看似比较长,但主要操作主要有2个

  1. 再次校验一下当前线程数是否超过核心线程数(或最大线程数),通过CAS操作,来保证线程数这个变量是线程安全的
  2. 启动线程,病执行传入的任务

Java线程池ThreadPoolExecutor源码快速理解_第4张图片

Worker类初始化对象时,就会创建一个线程

Worker的run()方法在做什么

Java线程池ThreadPoolExecutor源码快速理解_第5张图片

线程启动之后,就不停的从队列里拿任务,如果拿到任务,就执行

从队列取任务

Java线程池ThreadPoolExecutor源码快速理解_第6张图片

从队列拿任务时,workQueuq.take()方法,如果队列里没有任务,这个方法会使线程阻塞。

但是往队列里放任务用的是offer()方法,这个方法在队列满的时候,直接返回false,而不是阻塞线程

你可能感兴趣的:(Java线程池ThreadPoolExecutor源码快速理解)