首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ThreadPoolExecutor线程池学习笔记

ThreadPoolExecutor线程池学习笔记

作者头像
关忆北.
发布2021-12-07 16:42:31
3800
发布2021-12-07 16:42:31
举报
文章被收录于专栏:关忆北.关忆北.
一、线程池是什么

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

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

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

在这里插入图片描述
在这里插入图片描述

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

图2 ThreadPoolExecutor运行流程
图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 线程池生命周期
图3 线程池生命周期
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-06-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、线程池是什么
  • 线程池的组成
  • 线程池生命周期
相关产品与服务
NAT 网关
NAT 网关(NAT Gateway)提供 IP 地址转换服务,为腾讯云内资源提供高性能的 Internet 访问服务。通过 NAT 网关,在腾讯云上的资源可以更安全的访问 Internet,保护私有网络信息不直接暴露公网;您也可以通过 NAT 网关实现海量的公网访问,最大支持1000万以上的并发连接数;NAT 网关还支持 IP 级流量管控,可实时查看流量数据,帮助您快速定位异常流量,排查网络故障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档