| 状态 | value | 说明 | |
|---|---|---|---|
| RUNNING(当线程池创建出来的初始状态) | 111 | -1 | 能接受任务,能执行阻塞任务 |
| SHUTDOWN(调用shutdown方法) | 000 | 0 | 不接受新任务,能执行阻塞任务 肯定可以 執行正在執行的任務 |
| STOP(调用shutDownNow) | 001 | 1 | 不接受新任务,打断正在执行的任务,丢弃阻塞任务 |
| TIDYING(中间状态) | 010 | 2 | 任务全部执行完,活动线程也没了 |
| TERMINATED(终结状态) | 011 | 3 | 线程池终结 |
为什么要使用一个变量的高低位来表示而不是分为两个变量表示?
因为线程池状态和数量经常是一起变化的,分为两个变量表示不能保证操作的原子性,需要额外添加同步机制。而使用一个AtomicInteger变量进行CAS操作能够保证原子性。
线程池的创建方式
1. new ThreadPoolExecutor() 构造方法创建
2. Executors.newFixedThreadPool() 工厂方法创建 (不推荐使用,屏蔽了太多参数,灵活性受限)
工作方式
:::tips
创建核心线程->核心线程满->进队列,队列满—>才创建空闲线程
:::
- 线程池中刚开始没有线程,当一个任务提交给线程池后,线程池会创建一个新线程来执行任务
- 当线程数达到核心线程数上限,这时再加入任务,新加的任务会被加入队列当中去
- 前提是有界队列,任务超过了队列大小时,会创建 maximumPoolSize - corePoolSize 数目的线程数目作为空闲线程来执行任务。
- 如果线程到达 maximumPoolSize 仍然有新任务这时会执行拒绝策略
**核心线程数为0,无界队列的情况!!!任务依然会执行
添加到队列后,如果此时正在工作的线程是0,会执行addWorker(null, false)。
**

