• 降低资源消耗
  • 提高响应速度
  • 提高线程的可管理性

    线程池状态

    image.png
    ThreadPoolExecutor 使用一个AtomicInteger的高3位来表示线程池状态低29位表示线程数量
状态 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() 工厂方法创建 (不推荐使用,屏蔽了太多参数,灵活性受限)

工作方式


五、线程池 - 图2 :::tips 创建核心线程->核心线程满->进队列,队列满—>才创建空闲线程 :::

  1. 线程池中刚开始没有线程,当一个任务提交给线程池后,线程池会创建一个新线程来执行任务
  2. 当线程数达到核心线程数上限,这时再加入任务,新加的任务会被加入队列当中去
  3. 前提是有界队列,任务超过了队列大小时,会创建 maximumPoolSize - corePoolSize 数目的线程数目作为空闲线程来执行任务。
  4. 如果线程到达 maximumPoolSize 仍然有新任务这时会执行拒绝策略

**核心线程数为0,无界队列的情况!!!任务依然会执行
添加到队列后,如果此时正在工作的线程是0,会执行addWorker(null, false)。
image.png**