恒久地平线

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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

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

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

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

创建线程池

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

往线程池里添加任务

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

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

启动线程 

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

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

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

Worker的run()方法在做什么

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

从队列取任务

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

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

posted on 2020-08-13 23:59  恒久地平线  阅读(107)  评论(0编辑  收藏  举报

腾讯微博:http://t.qq.com/zhangxh20