当前位置:首页 > 科技  > 软件

你真的了解线程池的七个参数是做什么的吗?

来源: 责编: 时间:2023-10-18 09:18:28 377观看
导读问:可以说一下线程池吗?关于线程池的问题,大多数面试官会问线程池的几个参数的含义,今天就直接聊一聊线程池ThreadPoolExecutor。先说下线程池中几个参数的含义:ThreadPoolExecutor初始化的时候一般会有7个参数:corePoolSiz

问:可以说一下线程池吗?

关于线程池的问题,大多数面试官会问线程池的几个参数的含义,今天就直接聊一聊线程池ThreadPoolExecutor。MLC28资讯网——每日最新资讯28at.com

先说下线程池中几个参数的含义:

ThreadPoolExecutor初始化的时候一般会有7个参数:MLC28资讯网——每日最新资讯28at.com

  • corePoolSize:核心线程数
  • maximumPoolSize:最大线程数
  • keepAliveTime:非核心线程保活时间
  • unit:单位
  • workQueue:队列
  • Executors.defaultThreadFactory():线程工场
  • 拒绝策略

ThreadPoolExecutor的工作原理:

往线程池中提交第一个任务,底层会创建第一个核心线程,将线程和任务封装为一个woker对象放入set集合中,接下来每提交一个的任务都会对应创建一个核心线程和这个任务封装的woker对象放入set集合中,直到核心线程数达到corePoolSize,再次提交到线程池的任务会被放到阻塞队列排队执行,如果放队列的过程中,队列满了,就会创建一个非核心线程和这个任务封装为woker对象放入set集合中,如果最终已经达到最大线程数maximumPoolSize,就采用拒绝策略。如果放入队列过程中发现工作线程数位0,则创建一个空任务的Worker。MLC28资讯网——每日最新资讯28at.com

再来看下线程池的标识:

线程池的标识有两层含义:MLC28资讯网——每日最新资讯28at.com

  • 一个含义是当前线程池中的线程数量;
  • 一个含义是当前线程池的状态;

底层是用按位分隔的设计方式将一个int类型的变量的32位进行分割,用高3位表示线程状态,低29位表示线程数量。MLC28资讯网——每日最新资讯28at.com

线程池的5个状态:RUNNING= -1,正常运行状态 SHUTDOWN= 0, 表示不接受新任务,只把队列中的任务处理完结束。STOP= 1,表示不接受新任务,也不处理队列中的任务了。IDYING= 2,非正常状态 TERMINATED = 3,死亡状态MLC28资讯网——每日最新资讯28at.com

按位分割的好处就是用一个变量表示两个状态,在修改的时候可以利用cas保证原子性。MLC28资讯网——每日最新资讯28at.com

Worker对象创建逻辑是由addWorker方法实现的。MLC28资讯网——每日最新资讯28at.com

addWorker方法逻辑:

retry;双层循环

第一层循环主要判断:如果当前线程池状态为RUNNING就放行, 如果状态为SHUTDOWN就必须满足传进来的新任务为null,队列中有待处理的任务才会放行(因为SHUTDOWN状态下不接受新任务,只处理队列中的任务);如果状态为STOP,IDYING,TERMINATED就一定不放行;MLC28资讯网——每日最新资讯28at.com

第二层循环主要是判断线程数,如果是创建核心线程,就判断是否达到corePoolSize,否则就判断是否达到maximumPoolSize,如果达到就返回fasle不放行。MLC28资讯网——每日最新资讯28at.com

如果未达到就放行,放行的时候会利用cas更新线程数,如果更新成功则两层循环结束,继续下面的逻辑。MLC28资讯网——每日最新资讯28at.com

因为是cas操作,多线程的情况下可能会有更新线程数量失败的情况,在这种情况下要判断之前获取的线程池状态和现在的线程池状态是否一致,如果不一致那就要重新判断状态,从而进入到外层循环的下一轮循环,如果一致就只需要进入到内层循环的下一轮循环。MLC28资讯网——每日最新资讯28at.com

创建Worker对象

接下来就是创建Worker(任务),Worker类继承aqs,封装了线程工厂,初始化的时候会利用工厂创建一个线程,并且和传进来的任务封装为worker对象。MLC28资讯网——每日最新资讯28at.com

获取线程池全局锁(reentrylock作为线程池全局锁),进行上锁操作MLC28资讯网——每日最新资讯28at.com

将创建的worker加入workers集合,workers是一个hashset集合。MLC28资讯网——每日最新资讯28at.com

放入集合后就可以解锁了MLC28资讯网——每日最新资讯28at.com

worker创建完成了,接下来就是启动线程,启动线程后就会执行worker中的run方法MLC28资讯网——每日最新资讯28at.com

run方法流程

这个方法中主要的逻辑是这段代码MLC28资讯网——每日最新资讯28at.com

while (task != null || (task = getTask()) != null){  逻辑}

task是worker对象封装的任务。如果当前worker对象上没有任务就调用getTask去阻塞队列拿任务,如果能拿到就处理任务。如果getTask返回null就跳出循环,进入processWorkerExit方法。MLC28资讯网——每日最新资讯28at.com

我们知道线程池中的任务是放在队列中的,ThreadPoolExecutor中的队列一般默认是阻塞队列LinkedBlockingQueue,MLC28资讯网——每日最新资讯28at.com

getTask()方法会在这个队列中拿任务,如果有任务就直接返回任务,如果此时队列中无任务,当前线程会阻塞等待任务到来。MLC28资讯网——每日最新资讯28at.com

但是如果设置了非核心线程最大空闲时间keepAliveTime,代表非核心线程的worker对象中的线程在拿任务的时候不会用take方法,而是用poll,poll这个方法可以设置阻塞等待时间为keepAliveTime。当超过这个时间还没有任务就会返回null。MLC28资讯网——每日最新资讯28at.com

  1. processWorkerExit方法逻辑

上一步中如果没有获取到任务并且返回了null就会进入processWorkerExit方法。这个方法的逻辑就是把当前非核心线程的worker从workers集合中移除。最后会做一个判断:如果此时没有任何工作线程了,并且阻塞队列中还有任务,那就再创建一个不带任务的非核心线程worker。保证有线程去处理队列中的任务。MLC28资讯网——每日最新资讯28at.com

拒绝策略:MLC28资讯网——每日最新资讯28at.com

  • AbortPolicy(默认):丢弃任务并抛出 RejectedExecutionException 异常。
  • CallerRunsPolicy:由调用线程处理该任务。
  • DiscardPolicy:丢弃任务,但是不抛出异常。可以配合这种模式进行自定义的处理方式。
  • DiscardOldestPolicy:丢弃队列最早的未处理任务,然后重新尝试执行任务。

其他了解:MLC28资讯网——每日最新资讯28at.com

线程监控API: while (true) { System.out.println(); int queueSize = tpe.getQueue().size(); System.out.println("当前排队线程数:" + queueSize); int activeCount = tpe.getActiveCount(); System.out.println("当前活动线程数:" + activeCount); long completedTaskCount = tpe.getCompletedTaskCount(); System.out.println("执行完成线程数:" + completedTaskCount); long taskCount = tpe.getTaskCount(); System.out.println("总线程数:" + taskCount); Thread.sleep(3000); }


MLC28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-13831-0.html你真的了解线程池的七个参数是做什么的吗?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Spring Boot的自动配置原理及示例说明

下一篇: 用Babel和Nodemon搭建一个功能齐全的Nodejs开发环境

标签:
  • 热门焦点
  • 天猫精灵Sound Pro体验:智能音箱没有音质?来听听我的

    这几年除了手机作为智能生活终端最主要的核心之外,第二个可以成为中心点的产品是什么?——是智能音箱。 手机在执行命令的时候有两种操作方式,手和智能语音助手,而智能音箱只
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之“想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!”曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • 8月见!小米MIX Fold 3获得3C认证:支持67W快充

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都得到了不少爆料,而小米新一代折叠屏旗舰——小米MIX Fold 3此前也屡屡被传
  • 3699元!iQOO Neo8 Pro顶配版今日首销:1TB UFS 4.0同价位唯一

    5月23日,iQOO推出了全新的iQOO Neo8系列,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更是首发搭载了联发科天玑9200+旗舰
  • DRAM存储器10月价格下跌,NAND闪存本月价格与上月持平

    10月30日,据韩国媒体消息,自今年年初以来一直在上涨的 DRAM 存储器的交易价格仅在本月就下跌了近 10%,此次是全年首次降价,而NAND 闪存本月价格与上月持平。市
Top