ThreadPoolExecutor线程池学习笔记

Posted 爱叨叨的程序狗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ThreadPoolExecutor线程池学习笔记相关的知识,希望对你有一定的参考价值。

一、线程池是什么

线程池是一种基于池化思想管理线程的工具。

创建/销毁是一个耗时操作,频繁使用会降低整体性能,使用线程池维护多个线程,可有效降低运行中性能开销,以及更好的管理线程。

Java中自定义线程池是自JDK1.5后出现的ThreadPoolExecutor。 Executor提供了一种思想:将任务提交和任务执行进行解耦,在编码时只需将要执行耗时操作逻辑放入Runanble中即可,无需关心线程调度和执行。

在这里插入图片描述

ExecutorService提供了扩充执行任务的能力,在执行线程内操作时可以获取执行后的返回值Future,同时提供了线程池管控能力。

图2 ThreadPoolExecutor运行流程

线程池内部实际上构建了一个生产者、消费者模型,将线程和任务解耦,并不直接关联,从而复用线程。

线程池的组成

  1. 任务管理:(生产者角色)
  2. 线程管理:(消费者角色)

当提交任务后所经步骤:

  1. 直接申请线程执行该任务
  2. 缓冲到队列中等待线程执行
  3. 拒绝该任务

线程被统一维护在线程池内,根据任务请求进行线程分配,当线程执行完任务后会继续获取新任务执行,最终当线程获取不到任务的时候,线程就会被回收。

线程池生命周期

线程池生命周期是由内部隐式维护,线程池的运行状态(runState)和有效线程数量(workerCount)关乎线程池的运行状态。

private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));

主池控制状态ctl是一个原子整数,封装了两个概念字段workerCount,表示有效线程数runState,表示是否正在运行、正在关闭等,高3位保存runState,低29位保存workerCount

runState 提供主要的生命周期控制,取值:

  • RUNNING:接受新任务并处理排队任务
  • SHUTDOWN:关闭状态,不接受新任务,但处理排队任务
  • STOP:不接受新任务,不处理排队任务,并中断正在进行的任务
  • TIDYING:所有任务都已终止
  • TERMINATED:terminate() 已完成

当workerCount 为零时,转换到状态 TIDYING 的线程将运行 terminate() 钩子方法。

private static int runStateOf(int c)     { return c & ~CAPACITY; } //计算当前运行状态
private static int workerCountOf(int c)  { return c & CAPACITY; }  //计算当前线程数量
private static int ctlOf(int rs, int wc) { return rs | wc; }   //通过状态和线程数生成ctl

runState 随时间递增,但不需要命中每个状态。 转换是: RUNNING -> SHUTDOWN 在调用 shutdown() 时,可能隐含在 finalize() 中(RUNNING 或 SHUTDOWN)-> STOP 在调用 shutdownNow() 时 SHUTDOWN -> TIDYING 当队列和池都为空时 STOP -> TIDYING当池为空时 TIDYING -> TERMINATED 当 terminate() 钩子方法完成时,在 awaitTermination() 中等待的线程将在状态达到 TERMINATED 时返回。 检测从 SHUTDOWN 到 TIDYING 的转换,因为在非空之后队列可能会变空,在 SHUTDOWN 状态期间反之亦然,但是我们只能在看到它为空后看到 workerCount 时才终止是 0

生命周期流程

图3 线程池生命周期

以上是关于ThreadPoolExecutor线程池学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程高并发学习笔记——深入理解线程池

手写一个线程池,带你学习ThreadPoolExecutor线程池实现原理

深入理解java线程池—ThreadPoolExecutor

Android线程管理之ThreadPoolExecutor自定义线程池

Java常用四大线程池用法以及ThreadPoolExecutor详解

Java常用四大线程池用法以及ThreadPoolExecutor详解