首页 > 其他分享 >线程池的执行流程、状态及类型

线程池的执行流程、状态及类型

时间:2024-09-19 11:53:29浏览次数:3  
标签:状态 队列 流程 任务 线程 类型 执行 空闲

线程池的理解

        线程池是用于管理和复用线程的一种技术,可以优化线程的执行效率。因为,频繁创建和销毁线程,会带来额外的系统开销,而线程池可以通过创建并重用一组线程来执行任务,可以显著减少这种开销,提高程序的性能和响应能力。 

        线程池内部维护了若干个线程,没有任务的时候,这些线程都处于等待空闲状态。如果有新的线程任务,就分配一个空闲线程执行。如果所有线程都处于忙碌状态,线程池会创建一个新线程进行处理或者放入队列(工作队列)中等待。 

线程池的执行流程

线程池的核心配置参数

  • corePoolSize: 线程池的核心线程数

  • maximumPoolSize: 线程池的最大线程数

  • keepAliveTime和unit: 线程池中非核心线程空闲的存活时间值和时间单位

  • workQueue: 阻塞工作队列,存放等待执行的线程任务;

  • threadFactory: 创建新线程的线程工厂

  • handler: 线程池的拒绝策略

线程池执行流程

  • 提交一个新的线程任务,线程池会在线程池中分配一个空闲线程,用于执行线程任务;
  • 如果线程池中不存在线程任务,则线程池会判断当前“存活的线程数”是否小于核心线程数corePoolSize;
    • 如果小于核心线程数,线程池会创建一个新的线程(核心线程)去处理新线程任务;
    • 如果大于核心线程数,线程池会检查工作队列;
      • 如果工作队列未满,则将该线程任务放入工作队列进行等待。线程池中如果出现空闲线程,将从工作队列中按照FIFO的规则取出1个线程任务并分配执行;
      • 如果工作队列已满,则判断线程数是否达到最大线程数;
        • 如果当前“存活线程数”没有达到最大线程数,则直接创建一个新线程(非核心线程)执行新线程任务;
        • 如果当前“存活线程数”达到最大线程数,则直接采用拒绝策略处理新线程任务;
线程池的四种拒绝策略:

AbortPolicy :默认策略,丢弃任务并抛出RejectedExecutionException异常;
DiscardPolicy : 丢弃任务,不抛出异常;
DiscardOldestPolicy:丢弃队列中的末尾任务(最老的任务,也就是最早进入队列的任务)后,重新将当前任务提交给线程池处理;
CallerRunsPolicy:提交线程任务的业务线程直接执行线程任务的run()方法,线程池不再负责处理 ;

执行流程图 

 线程池的状态

线程池的状态包括: RUNNING  , SHUTDOWN  , STOP  , TIDYING  , TERMINATED 

RUNNING:运行状态,线程池一旦被创建,就处于RUNNING状态,并且线程池中的任务数为0.该状态的线程池会接收新任务,并处理工作队列中的任务。

  • 调用线程池的shutdown()方法,可以切换到SHUTDOWN关闭状态;
  • 调用线程池的shutdownnow()方法,可以切换到STOP停止状态;

SHUTDOWN:关闭状态,该状态的线程池不会接收新任务,但会处理工作队列中的任务;

  • 当工作队列为空时,且线程池中执行的任务也为空时,线程池进入TIDYING状态;

STOP:停止状态,该状态的线程不会接收新任务,也不会处理阻塞队列中的任务,而且会中断正在运行的任务;

  • 线程池中执行的任务为空,线程池进入TIDYING状态;

TIDYING:整理任务,该状态表明所有的任务已经运行终止,记录的任务数量为0;

  • terminated()执行完毕,进入TERMINATED状态;

TERMINATED:终止状态,该状态表锁线程池彻底关闭。

 线程池的类型

FixedThreadPool:线程数固定的线程池

线程池参数: 

  • 核心线程数和最大线程数一致
  • 非核心线程线程空闲存活时间,即keepAliveTime为0
  • 阻塞队列为无界队列LinkedBlockingQueue

工作机制: 

  • 提交线程任务
  • 如果线程数少于核心线程,创建核心线程执行任务 
  • 如果线程数等于核心线程,把任务添加到LinkedBlockingQueue阻塞队列 
  • 如果线程执行完任务,去阻塞队列取任务,继续执行 

使用场景: 适用于处理CPU密集型的任务,确保CPU在长期被工作线程使用的情况下,尽可能的少的分配线程,即适用执行长期的任务。 

 CachedThreadPool:可缓存线程池,线程数根据任务动态调整的线程池

线程池参数:

  • 核心线程数为0 
  • 最大线程数为Integer.MAX_VALUE 
  • 工作队列是SynchronousQueue同步队列
  • 非核心线程空闲存活时间为60秒 

工作机制: 

  • 提交线程任务
  • 因为核心线程数为0,所以任务直接加到SynchronousQueue工作队列
  • 判断是否有空闲线程,如果有,就去取出任务执行
  • 如果没有空闲线程,就新建一个线程执行
  • 执行完任务的线程,还可以存活60秒,如果在这期间,接到任务,可以继续存活下去;否则,被销毁。 

使用场景: 用于并发执行大量短期的小任务。

 SingleThreadExecutor:单线程化的线程池

线程池参数:

  • 核心线程数为1
  • 最大线程数也为1 
  • 阻塞队列是LinkedBlockingQueue 
  • 非核心线程空闲存活时间为0秒

使用场景: 适用于串行执行任务的场景,将任务按顺序执行。

ScheduledThreadPool:能实现定时、周期性任务的线程池

线程池参数: 

  • 最大线程数为Integer.MAX_VALUE 
  • 阻塞队列是DelayedWorkQueue 
  • keepAliveTime为0

使用场景: 周期性执行任务,并且需要限制线程数量的需求场景。

标签:状态,队列,流程,任务,线程,类型,执行,空闲
From: https://blog.csdn.net/Katharine_Yuan/article/details/142354961

相关文章

  • 线程池的执行流程是什么?(核心参数、执行流程、拒绝策略)
    一、线程池的执行流程1.首先,向线程池提交一个线程任务,线程池会分配空闲线程去处理该线程任务。2.如果没有空闲线程就判断当前存活线程数是否超过核心线程数:    (1)没有超过就创建一个核心线程,处理线程任务。        (2)超过核心线程数就将存活线程存放在工......
  • 简化插件的添加和更新流程
    NocoBase是一个极易扩展的开源无代码开发平台。完全掌控,无限扩展,助力你的开发团队快速响应变化,显著降低成本,不必投入几年时间和数百万资金研发,只需要花几分钟部署NocoBase。NocoBase中文官网官方文档在线Demo为了提升插件管理的体验,我们近期对插件管理器模块进行了重要更......
  • 鸿蒙原生应用元服务开发-仓颉基础数据类型字符类型
    字符类型使用Rune表示,可以表示Unicode字符集中的所有字符。字符类型字面量字符类型字面量有三种形式:单个字符、转义字符和通用字符。一个Rune字面量由字符r开头,后跟一个由一对单引号或双引号包含的字符。单个字符的字符字面量举例:leta:Rune=r'a'letb:Rune=r"b"转......
  • 纷享销客“子流程”创新——企业流程管理的革新之选
    Jack是一家电子商务企业的销售经理,近期他的公司订单量激增,但随之而来的退货流程却成了一个棘手的问题。每天,成百上千的退货请求涌向客服部门,而退货流程的每一步:从接收退货申请、物流派单、商品检验入库,到最终的财务退款,都至关重要,却也复杂繁琐。任何一步的延误都可能影响到客户满......
  • springboot中如何使用线程池
    springboot中如何使用线程池在SpringBoot中使用线程池,你可以定义一个ThreadPoolTaskExecutor的Bean,然后在需要的地方使用@Autowired注入这个Bean。以下是一个配置线程池的例子:importorg.springframework.context.annotation.Bean;importorg.springframew......
  • 全面解读大模型备案流程及重点、难点解析【附教程】
    本文详解大模型备案流程,旨在指引企业和开发者顺利完成备案,确保企业成功拿到大模型备案号。一、政策要求做大模型备案大模型备案是中国国家互联网信息办公室为加强生成式人工智能服务的管理,确保用户权益得到充分保护,以及保障国家安全和社会秩序稳定而实施的一项关键性政策。......
  • 火语言RPA流程组件介绍--设置元素属性值
    ......
  • 《深入理解 Java 线程池:高效管理线程的利器》
    线程池1.什么是线程池?​线程池内部维护了若干个线程,没有任务的时候,这些线程都处于等待空闲状态。如果有新的线程任务,就分配一个空闲线程执行。如果所有线程都处于忙碌状态,线程池会创建一个新线程进行处理或者放入队列(工作队列)中等待。2.线程池常用类和接口​在Java标......
  • js数值类型
    目录背景数字整型直接量浮点型直接量JavaScript中的算术运算背景JavaScript的数据类型分为两类,原始类型(primitivetype)和对象类(objecttype)js中的原始类型包括数字,字符串,布尔值js中有两个特殊的原始值:null(空)和undefined(未定义).它们代表了各自特殊类型的唯一成员......
  • 学习高校课程-软件工程-软件流程(ch3)
    3.1AGENERICPROCESSMODEL通用过程模型线性流和迭代流演化流和并行流3.2DEFININGAFRAMEWORKACTIVITY定义框架活动Whatactionsareappropriateforaframeworkactivity,giventhenatureoftheproblemtobesolved,thecharacteristicsofthepeopledoin......