ThreadPoolExecutor原理详情讲解

一、简介
ThreadPoolExecutor是Java中的一个类,它实现了ExecutorService接口,用于创建一个线程池。线程池是一种线程使用模式,它维护着一组线程,等待监督管理者分配可以并发执行的任务。ThreadPoolExecutor的主要目标是减少在创建和销毁线程上花费的时间以及系统资源的开销,提高系统的响应速度。
二、工作原理

  • 当一个任务通过execute(Runnable)方法添加到线程池时,如果线程池中的线程数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也会创建新的线程来处理被添加的任务。
  • 如果线程池中的线程数量等于corePoolSize,但缓冲队列workQueue未满,那么任务会被放入缓冲队列等待执行。
  • 如果线程池中的线程数量大于corePoolSize,缓冲队列workQueue已满,并且线程池中的线程数量小于maximumPoolSize,那么会创建新的线程来处理被添加的任务。
  • 如果线程池中的线程数量大于corePoolSize,缓冲队列workQueue已满,并且线程池中的线程数量等于maximumPoolSize,那么会通过handler所指定的策略来处理此任务。
    在这里插入图片描述
    public void execute(Runnable command) {if (command == null)throw new NullPointerException();//获取ctl的值int c = ctl.get();/*** 第一步:* 调用workerCountOf 计算活跃的工作线程数* 判断工作线程数 是否小于 核心线程数*/if (workerCountOf(c) < corePoolSize) {// 工作线程数 小于 核心线程数,则通过addWorker方法创建核心线程,true代表核心线程if (addWorker(command, true))// 此时线程被创建,但是需要等调用start();线程被启动了,才算addWorker成功return;//创建新的线程后,ctl被修改,这里重新获取ctl属性值,因为当有多个线程同时调用addWorker,只有一个线程会成功创建新的线程后修改ctl,此时其他的线程需要重新获取ctl属性值c = ctl.get();}/*** 第二步:* 工作线程数 不小于 核心线程数,且当线程池处于RUNNING状态时* 尝试将任务加入到队列中** isRunning(c) 判断线程池状态,创建线程失败可能造成线程池停止,所以需要再次判断线程池运行状态*/if (isRunning(c) && workQueue.offer(command)) {// 添加任务到队列成功后,再次获取最新ctl属性值int recheck = ctl.get();// 加入队列后这里又重新调用了isRunning(recheck) ,主要是防止任务加入队列后,线程池状态改变了//如果线程池不是RUNNING状态时,就需要移除已加入队列的任务(线程池不是RUNNING状态,比如调用了 shutdown 方法等,无法执行)if (! isRunning(recheck) && remove(command))// 如果线程池不是RUNNING状态,并且移除任务成功,则执行拒绝策略reject(command);// 走到这里说明,线程池不是处于RUNNING状态// 调用workerCountOf(recheck) 获取活跃的工作线程,判断是否为0,如果为0,则创建非核心线程将队列中任务执行完else if (workerCountOf(recheck) == 0)// 如果工作线程为0,则创建一个空的任务,通过addWorker方法的t.start启动线程,然后通过runWorker方法执行task.run(),直到队列中所有的任务都执行完成addWorker(null, false);}/*** 第三步:* 如果队列满了,则创建非核心线程,false代表非核心线程*/else if (!addWorker(command, false))// 核心线程数 + 非核心线程数 超过了最大线程数,则执行拒绝策略reject(command);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/491947.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Animated Trees Package

此软件包包含30个高质量的全动画树木。所有模型都是用Blender 3D制作的。 要安装URP或HDRP材质,请选择主文件夹中的“URP Materials”或“HDRP Materials”包文件,并导入所有文件。 下载:​​Unity资源商店链接资源下载链接 提取码:3gng 效果图:

正大国际:高频交易可以做吗?

第一种&#xff1a;抄单交易 这种做法也可以称之无脑型抄单&#xff0c;就是一旦进场之后&#xff0c;几秒钟内&#xff0c;不管是盈利还是亏损就要立即出来。交易时间一般是2-5秒&#xff0c;每天可能要做上几百次&#xff0c;或者上千次来回交易。这种做法对品种有要求&…

纯国产轻量化数字孪生:智慧城市、智慧工厂、智慧校园、智慧社区。。。

AMRT 3D数字孪生引擎介绍 AMRT3D引擎是一款融合了眸瑞科技的AMRT格式与轻量化处理技术为基础&#xff0c;以降本增效为目标&#xff0c;支持多端发布的一站式纯国产自研的CS架构项目开发引擎。 引擎包括场景搭建、UI拼搭、零代码交互事件、光影特效组件、GIS/BIM组件、实时数据…

腾轩科技传媒分享创建舞蹈家百度百科词条流程

近年来&#xff0c;随着互联网的不断发展&#xff0c;人们获取信息的方式也逐渐多样化&#xff0c;其中百度百科作为一个综合性的知识平台&#xff0c;为人们提供了一个方便快捷的途径来获取各种知识和信息。在百度百科上&#xff0c;每个人都有可能成为一个有影响力的人&#…

matlab simulink永磁同步电机pid控制

1、内容简介 略 53-可以交流、咨询、答疑 2、内容说明 略 摘 要 19世纪90年代&#xff0c;美国西屋电气公司研制出了世界上第一台交流同步电机。随着科学技术的迅猛发展和生产工艺的持续进步&#xff0c;在20世纪50年代出现了永磁同步电机。它以永磁体代替电励磁绕组&#…

解决vulhub漏洞环境下载慢卡死问题即解决docker-valhub漏洞环境下载慢的问题

解决vulhub环境下载慢/卡 当前环境为&#xff1a;ubuntu20 1.在 cd /etc/docker/目录下创建或修改daemon.json文件 sudo touch daemon.json编辑daemon.json文件 sudo vim daemon.json2.填写阿里云镜像地址&#xff1a; { "registry-mirrors":["https://6kx…

opencv图像处理

// 提取路口轮廓集合&#xff08;每个路口的轮廓为一系列点集&#xff09; std::vector<std::vector<cv::Point>> node_contours; std::vector<cv::Vec4i> node_hierarchy;保存轮廓的层次关系// 只提取外轮廓 轮廓近似方法&#xff1a;水平垂直对角线只保留端…

如何移除禁用WordPress默认小工具(附WordPress默认小工具名称)

WordPress 自带的小工具非常多&#xff0c;但是我们用到的也就那么几种&#xff0c;甚至一种都不会用到&#xff0c;所以很有必要注销&#xff08;去除&#xff09;掉一些不用的小工具。实现的方法也很简单&#xff0c;只需将以下代码&#xff0c;根据自己的情况删除需要用的小…

GPU over IP/IB:趋动OrionX产品的创新之路

在数字化转型的浪潮中&#xff0c;GPU over IP/IB技术正成为数据中心和云计算领域的一股新兴力量。这种技术通过将物理GPU资源虚拟化&#xff0c;实现了跨网络的高效利用&#xff0c;为AI、机器学习、科学计算等高性能计算任务提供了前所未有的灵活性和扩展性。 本文将深入探讨…

时序预测 | Matlab实现基于GRNN广义回归神经网络的光伏功率预测模型

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 1.时序预测 | Matlab实现基于GRNN广义回归神经网络的光伏功率预测模型 2.单变量时间序列预测; 3.多指标评价,评价指标包括:R2、MAE、MBE等,代码质量极高; 4.excel数据,方便替换,运行环境2020及以上。 广义回…

Python in Excel的一些使用心得

获得Python in Excel的preview之后, 就在任意的Excel单元格里可以敲py(来写Python代码了。不过Python in Excel并没有什么专门的文档, 只有一些_Get Started_教程, 比如link 1, link 2, 剩下的就是pandas, matplotlib, seaborn等lib的文章&#xff0c;和Python in Excel并没有什…

YOLOv9来了,可编程梯度信息与广义高效层聚合网络 助力全新检测SOTA前沿

本文首发&#xff1a;AIWalker 欢迎关注AIWalker&#xff0c;近距离接触底层视觉与基础AI技术 摘要 当今的深度学习方法侧重于如何设计最合适的目标函数&#xff0c;以便模型的预测结果最接近真实情况&#xff1b;与此同时&#xff0c;必须设计一个适当的架构&#xff0c;以便…