冰河技术
导读
♻学习路线
  • 面试必问系列

    • 面试必问
  • 架构与模式

    • Java极简设计模式
    • 实战高并发设计模式
  • Java核心技术

    • Java8新特性
    • IOC核心技术
    • JVM调优技术
  • 容器化核心技术

    • Dockek核心技术
  • 分布式存储

    • Mycat核心技术
  • 数据库核心技术

    • MySQL基础篇
  • 服务器核心技术

    • Nginx核心技术
  • 渗透核心技术

    • 渗透实战技术
  • 底层技术
  • 源码分析
  • 基础案例
  • 实战案例
  • 面试
  • 系统架构
  • Spring6核心技术
  • 分布式事务

    • 分布式事务系列视频
  • SpringBoot
  • SpringCloudAlibaba
  • 🔥AI大模型项目

    • 一站式AI智能平台
    • AI智能客服系统
    • AI智能问答系统
    • 实战AI大模型
  • 中间件项目

    • 手写高性能Redis组件
    • 手写高性能脱敏组件
    • 手写线程池项目
    • 手写高性能SQL引擎
    • 手写高性能Polaris网关
    • 手写高性能RPC项目
  • 高并发项目

    • 分布式IM即时通讯系统(新)
    • 分布式Seckill秒杀系统
    • 实战高并发设计模式
  • 微服务项目

    • 简易电商脚手架项目
  • 手撕源码

    • 手撕Spring6源码
🌍知识星球
  • 总览

    • 《书籍汇总》
  • 出版图书

    • 《深入理解高并发编程:核心原理与案例实战》
    • 《深入理解高并发编程:JDK核心技术》
    • 《深入高平行開發:深度原理&專案實戰》
    • 《深入理解分布式事务:原理与实战》
    • 《MySQL技术大全:开发、优化与运维实战》
    • 《海量数据处理与大数据技术实战》
  • 电子书籍

    • 《实战高并发设计模式》
    • 《深入理解高并发编程(第2版)》
    • 《深入理解高并发编程(第1版)》
    • 《从零开始手写RPC框架(基础篇)》
    • 《SpringCloud Alibaba实战》
    • 《冰河的渗透实战笔记》
    • 《MySQL核心知识手册》
    • 《Spring IOC核心技术》
  • 关于自己
  • 关于学习
  • 关于职场
B站
Github
导读
♻学习路线
  • 面试必问系列

    • 面试必问
  • 架构与模式

    • Java极简设计模式
    • 实战高并发设计模式
  • Java核心技术

    • Java8新特性
    • IOC核心技术
    • JVM调优技术
  • 容器化核心技术

    • Dockek核心技术
  • 分布式存储

    • Mycat核心技术
  • 数据库核心技术

    • MySQL基础篇
  • 服务器核心技术

    • Nginx核心技术
  • 渗透核心技术

    • 渗透实战技术
  • 底层技术
  • 源码分析
  • 基础案例
  • 实战案例
  • 面试
  • 系统架构
  • Spring6核心技术
  • 分布式事务

    • 分布式事务系列视频
  • SpringBoot
  • SpringCloudAlibaba
  • 🔥AI大模型项目

    • 一站式AI智能平台
    • AI智能客服系统
    • AI智能问答系统
    • 实战AI大模型
  • 中间件项目

    • 手写高性能Redis组件
    • 手写高性能脱敏组件
    • 手写线程池项目
    • 手写高性能SQL引擎
    • 手写高性能Polaris网关
    • 手写高性能RPC项目
  • 高并发项目

    • 分布式IM即时通讯系统(新)
    • 分布式Seckill秒杀系统
    • 实战高并发设计模式
  • 微服务项目

    • 简易电商脚手架项目
  • 手撕源码

    • 手撕Spring6源码
🌍知识星球
  • 总览

    • 《书籍汇总》
  • 出版图书

    • 《深入理解高并发编程:核心原理与案例实战》
    • 《深入理解高并发编程:JDK核心技术》
    • 《深入高平行開發:深度原理&專案實戰》
    • 《深入理解分布式事务:原理与实战》
    • 《MySQL技术大全:开发、优化与运维实战》
    • 《海量数据处理与大数据技术实战》
  • 电子书籍

    • 《实战高并发设计模式》
    • 《深入理解高并发编程(第2版)》
    • 《深入理解高并发编程(第1版)》
    • 《从零开始手写RPC框架(基础篇)》
    • 《SpringCloud Alibaba实战》
    • 《冰河的渗透实战笔记》
    • 《MySQL核心知识手册》
    • 《Spring IOC核心技术》
  • 关于自己
  • 关于学习
  • 关于职场
B站
Github
  • 第01部分:专栏介绍

    • 开篇:我要带你一次性彻底吃透线程池核心技术
  • 第02部分:线程池核心技术

    • 第01节:线程池核心原理技术解析
    • 第02节:线程池总体结构技术解析
    • 第03节:线程池执行任务的核心流程解析
    • 第04节:Worker线程核心执行流程解析
    • 第05节:线程池优雅关闭核心流程解析
    • 第06节:定时任务线程池核心技术解析
  • 第03部分:实战手写线程池

    • 实战:400行代码手写线程池
  • 第04部分:专栏总结

    • 总结:手写线程池专栏整体总结

《手写线程池》线程池核心技术:第01节:线程池核心原理技术解析

作者:冰河
星球:http://m6z.cn/6aeFbs
博客:https://binghe.site
文章汇总:https://binghe.site/md/all/all.html
源码获取地址:https://t.zsxq.com/0dhvFs5oR

沉淀,成长,突破,帮助他人,成就自我。

  • 本章难度:★★★☆☆
  • 本章重点:简单介绍线程池的核心原理,重点掌握:线程池的核心状态、线程池的创建方式、执行任务的核心流程、线程池的关闭方式和如何确定最佳线程数等核心技术。从全局视角掌握线程池的核心技术原理,学会融汇贯通,将线程池的编程思想灵活应用到自身实际项目中,提升实际项目的并发处理能力,以及自身的并发编程内功功底。

大家好,我是冰河~~

使用线程池最大的好处就是能够实现线程的复用,不必每次执行任务时都重新创建线程。同时,线程池能够有效的控制最大并发线程数,防止无限制的创建线程导致系统宕机或OOM,能够提高系统资源的利用效率,同时能够有效的避免过度的资源竞争。

另外,线程池也提供了定时执行、定期执行、并发数控制等功能,也能够对线程池的资源进行实时监控。

一、前言

从本节开始,就正式进入《手写线程池》的线程池核心技术篇章。对于线程池的原理性技术来说,尤其是线程池的源码,学习起来是比较枯燥的,希望大家都能踏下心来,跟着冰河认真学。经过《手写线程池》专栏对线程池的深入剖析和我们自己从零开始手写一个线程池,我相信,只要小伙伴们认真学习,坚持下来后,一定会对线程池技术有一个全新的认识,并能够将线程池技术融会贯通,灵活应用到自身实际项目中。同时,也能在并发编程领域进一步突破自身的技术瓶颈。

二、本节诉求

简单介绍线程池的核心原理,重点掌握:线程池的核心状态、线程池的创建方式、执行任务的核心流程、线程池的关闭方式和如何确定最佳线程数等核心技术。从全局视角掌握线程池的核心技术原理,学会融汇贯通,将线程池的编程思想灵活应用到自身实际项目中,提升实际项目的并发处理能力,以及自身的并发编程内功功底。

三、线程池核心状态

线程池在运行的过程中,会通过定义的一些常量值来标注线程池的运行状态,接下来,就简单介绍下线程池在运行过程中的几个核心状态。

3.1 核心状态说明

在线程池的核心类ThreadPoolExecutor中,定义了几个关于线程池在运行过程中的核心状态。源码如下所示。

private static final int COUNT_BITS = Integer.SIZE - 3;
private static final int CAPACITY   = (1 << COUNT_BITS) - 1;

// runState is stored in the high-order bits
private static final int RUNNING    = -1 << COUNT_BITS;
private static final int SHUTDOWN   =  0 << COUNT_BITS;
private static final int STOP       =  1 << COUNT_BITS;
private static final int TIDYING    =  2 << COUNT_BITS;
private static final int TERMINATED =  3 << COUNT_BITS;

从源码中可以看出,线程池在运行的过程中所涉及到的核心状态包括:RUNNING、SHUTDOWN、STOP、TIDYING、TERMINATED。各个状态的具体含义说明如下所示。

  • RUNNING:表示线程池处于运行状态,此时线程池能够接收新提交过来的任务,并且也能够处理阻塞队列中的任务。

  • SHUTDOWN:表示线程池处于关闭状态,此时线程池不能再接收新提交过来的任务,但是不会中断正在执行任务的线程,能够继续执行正在执行的任务,也能够处理阻塞队列中已经保存的任务。如果线程池处于RUNNING状态时,调用线程池的shutdown()方法会使线程池进入SHUTDOWN状态。

  • STOP:表示线程池处于停止状态,此时线程池不能再接收新提交过来的任务,也不能继续处理阻塞队列中的任务,同时,还会中断正在执行任务的线程,使得正在执行的任务被中断。如果线程池处于RUNNING状态或者SHUTDOWN状态,调用线程池的shutdownNow()方法会使线程池进入STOP状态。

  • TIDYING:如果线程池中所有的任务都已经终止,有效线程数为0,线程池就会进入TIDYING状态。换句话说,线程池中已经没有正在执行的任务,并且线程池中的阻塞队列为空,同时线程池中的工作线程数量为0,此时,线程池就会进入TIDYING状态。

  • TERMINATED:如果线程池处于TIDYING状态,此时调用线程池的terminated()方法,线程池就会进入TERMINATED状态。

3.2 核心状态的流转过程

线程池在运行的过程中,其内部维护的状态变量的值不是一成不变的,而是会随着某些事件的触发而动态变化,线程池核心状态的流转过程如图1-1所示。


线程池由RUNNING状态转换成TERMINATED状态需要经过如下流程。

(1)当线程池处于RUNNING状态时,显示调用线程池的shutdown()方法,或者隐式调用finalize()方法,线程池会由RUNNING状态转换为SHUTDOWN状态。

(2)当线程池处于RUNNING状态时,显示调用线程池的shutdownNow()方法,线程池会由RUNNING状态转换为STOP状态。

(3)当线程池处于SHUTDOWN状态时,显示调用线程池的shutdownNow()方法,线程池会由SHUTDOWN状态转换为STOP状态。

(4)当线程池处于SHUTDOWN状态时,如果线程池中无工作线程,并且阻塞队列为空,则线程池会由SHUTDOWN状态转换为TIDYING状态。

(5)当线程池处于STOP状态时,如果线程池中无工作线程,则线程池会由STOP状态转换为TIDYING状态。

(6)当线程池处于TIDYING状态时,调用线程池的terminated()方法,线程池会由TIDYING状态转换为TERMINATED状态。

四、线程池的创建方式

查看完整文章

加入冰河技术知识星球,解锁完整技术文章、小册、视频与完整代码

在 GitHub 上编辑此页
上次更新: 2026/5/2 00:42
Contributors: binghe001
Next
第02节:线程池总体结构技术解析
阅读全文
×

扫码或搜索:冰河技术
发送:290992
即可立即永久解锁本站全部文章

星球会员
跳转链接