当前位置: 首页 > news >正文

线程池知识点总结

线程池是一种线程管理机制,通过预先创建一定数量的线程并复用它们,避免频繁创建和销毁线程带来的资源开销,是并发编程中的核心组件。以下从核心概念、工作机制、关键参数等方面进行总结:

一、线程池的核心作用

  1. 降低资源消耗:线程复用减少线程创建(涉及内核态操作)和销毁的开销。
  2. 控制并发强度:避免无限制创建线程导致的CPU切换过载、内存耗尽等问题。
  3. 提高响应速度:预先创建的线程可直接处理任务,无需等待线程初始化。
  4. 统一管理任务:支持任务排队、拒绝策略、监控等功能,便于任务生命周期管控。

二、核心参数(以Java ThreadPoolExecutor为例)

线程池的行为由7个核心参数决定,需根据任务特性(如CPU密集/IO密集)合理配置:

参数

作用描述

corePoolSize

核心线程数:线程池长期保留的线程数量(即使空闲也不销毁,除非设置allowCoreThreadTimeOut)。

maximumPoolSize

最大线程数:线程池允许创建的最大线程数(核心线程+临时线程)。

keepAliveTime

临时线程存活时间:当线程数超过corePoolSize时,多余线程的空闲存活时长。

unit

keepAliveTime的时间单位(如TimeUnit.SECONDS)。

workQueue

任务队列:用于存放未被立即执行的任务(当核心线程都在工作时)。

threadFactory

线程工厂:用于创建线程(可自定义线程名称、优先级等)。

handler

拒绝策略:当任务队列满且线程数达maximumPoolSize时,处理新提交任务的策略。

三、工作流程(任务提交后)

  1. 若当前线程数 < corePoolSize:直接创建核心线程执行任务。
  2. 若当前线程数 ≥ corePoolSize:将任务加入workQueue等待。
  3. workQueue已满,且当前线程数 < maximumPoolSize:创建临时线程执行任务。
  4. workQueue已满,且当前线程数 ≥ maximumPoolSize:触发handler拒绝策略

四、拒绝策略(Java默认4种)

当任务无法被处理时(队列满+线程达上限),需通过拒绝策略处理,避免任务丢失或系统崩溃:

策略类

行为描述

AbortPolicy

抛出RejectedExecutionException(默认策略,中断任务提交)。

CallerRunsPolicy

让提交任务的线程(如main线程)自己执行任务(降低提交速度,缓解压力)。

DiscardPolicy

直接丢弃新任务(无提示,可能丢失任务)。

DiscardOldestPolicy

丢弃任务队列中最旧的任务(队头),再尝试提交新任务。

:可自定义拒绝策略(实现RejectedExecutionHandler接口),如记录日志、持久化任务等。

五、常见线程池类型(Java Executors提供)

Executors封装了几种常用线程池,但不推荐生产环境使用存在资源风险):

线程池类型

核心参数配置

风险点

FixedThreadPool

核心线程数=最大线程数,队列LinkedBlockingQueue(无界)。

队列无界可能导致OOM(任务堆积过多)。

CachedThreadPool

核心线程数=0,最大线程数=Integer.MAX_VALUE,队列SynchronousQueue

最大线程数过大,可能创建大量线程导致OOM。

SingleThreadExecutor

核心线程数=最大线程数=1,队列LinkedBlockingQueue(无界)。

FixedThreadPool,队列无界风险。

ScheduledThreadPool

核心线程数固定,最大线程数=Integer.MAX_VALUE,支持定时/周期性任务。

最大线程数过大,可能创建大量线程导致OOM。

package com.day5;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;public class Demo06 {public static void main(String[] args) {
//        int i = Runtime.getRuntime().availableProcessors();
//        System.out.println(i);//1.固定大小线程池ExecutorService fixedThreadPool= Executors.newFixedThreadPool(5);//2.单线程线程池ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();//3.缓存线程池ExecutorService cachedThreadPool = Executors.newCachedThreadPool();//适合那种大型数量的任务,快速的去创建线程//4.定时任务线程池ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);//提交任务fixedThreadPool.execute(()-> System.out.println("Task exexcuted"));//关闭线程池fixedThreadPool.shutdown();}
}

六、线程池状态(生命周期)

ThreadPoolExecutor通过状态控制线程池行为,状态流转不可逆:

状态

描述

触发方式

RUNNING

运行中:接受新任务,处理队列任务。

线程池初始化后默认状态。

SHUTDOWN

关闭中:不接受新任务,但处理队列剩余任务。

调用shutdown()触发。

STOP

停止中:不接受新任务,不处理队列任务,中断所有正在执行的任务。

调用shutdownNow()触发。

TIDYING

整理中:所有任务终止,工作线程数=0,准备执行terminated()钩子方法。

SHUTDOWN状态下队列空且线程数=0,或STOP状态下线程数=0时进入。

TERMINATED

终止:terminated()执行完毕。

TIDYING状态结束后进入。

七、使用注意事项

  1. 避免使用Executors工具类:默认线程池的队列或最大线程数可能导致OOM,推荐手动创建ThreadPoolExecutor并指定参数。
  2. 合理配置核心参数
    • CPU密集型任务(如计算):核心线程数 ≈ CPU核心数(减少切换开销)。
    • IO密集型任务(如网络/磁盘操作):核心线程数 ≈ CPU核心数 * 2(利用线程空闲时间)。
  1. 任务队列选择
    • bounded队列(如ArrayBlockingQueue):控制任务堆积上限,避免OOM。
    • 避免无界队列(如LinkedBlockingQueue)除非明确任务量可控。
  1. 优雅关闭线程池:通过shutdown()(平缓关闭)或shutdownNow()(强制关闭),并配合awaitTermination()等待终止。
  2. 监控线程池:通过getActiveCount()(活跃线程数)、getQueue().size()(队列任务数)等方法监控状态,及时调整参数。

http://www.dtcms.com/a/326749.html

相关文章:

  • Spring Cloud Gateway 路由与过滤器实战:转发请求并添加自定义请求头(最新版本)
  • 【QT】UI 开发全攻略:打造专业级跨平台界面
  • Android14 QS编辑页面面板的加载解析
  • 梯度裁剪总结
  • Python Day27 HTML 核心知识笔记及例题分析
  • 09-docker镜像手动制作
  • PG靶机 - Flu
  • 常见鱼饵制作方式
  • 在 X86_64(amd64) 平台上的docker支持打包构建多环境镜像并推送镜像到Harbor
  • AI Coding 概述及学习路线图
  • uploader组件,批量上传怎么设置实时滚动
  • Anti-Aliasing/Mip-NeRF/Zip-NeRF/multi-scale representation
  • 2.一维码+二维码+字符识别
  • OpenHarmony概述与使用
  • 基于大数据的个性化学习环境构建的研究与应用
  • Java前后端交互核心技术:Servlet与JSP深度解析
  • 【Altium designer】一键给多个器件添加参数
  • 2025年渗透测试面试题总结-13(题目+回答)
  • 如何选择一家靠谱的开发公司开发项目呢?
  • sql select语句
  • Python 高阶函数:filter、map、reduce 详解
  • WebMCP 技术文档——让 AI 助手与 Web 应用无缝交互的轻量级框架
  • 基于cursor工具与AI大模型,规范驱动的全自然语言软件开发工作流实现路径
  • 导入CSV文件到MySQL
  • webpark》》
  • STM32CubeMX + HAL 库:用硬件IIC接口实现AT24C02 EEPROM芯片的读写操作
  • Kubernetes部署apisix的理论与最佳实践(一)
  • 【OpenGL】LearnOpenGL学习笔记06 - 坐标系统、MVP变换、绘制立方体
  • 用 t-SNE 把 KSC 高光谱“变成可转动的 3D 影像”——从零到会,逐段读懂代码并导出旋转 GIF
  • 二叉树进阶 之 【模拟实现二叉搜索树】(递归、非递归实现查找、插入、删除功能)