JUC基础认识(2)

news2025/1/13 13:39:03

线程池(重点):3大方法,7大参数,4种拒绝策略

程序运行的本质:占用系统资源!优化资源的使用!----->池化技术

池化技术的好处: 1.降低资源的消耗    2.提高响应速度   3.方便管理

线程复用,可以控制最大并发数,管理线程。

在 JDK5 版本中增加了内置线程池实现 ThreadPoolExecutor,同时提供了Executors 来创建不同类型的线程池。Executors 中提供了以下常见的线程池创 建方法:
newSingleThreadExecutor:一个单线程的线程池。如果因异常结束,会再创 建一个新的,保证按照提交顺序执行。
newFixedThreadPool:创建固定大小的线程池。根据提交的任务逐个增加线程, 直到最大值保持不变。如果因异常结束,会新创建一个线程补充。
newCachedThreadPool:创建一个可缓存的线程池。会根据任务自动新增或回 收线程。

ThreadPoolExecutor 类

Java.uitl.concurrent.ThreadPoolExecutor 类是线程池中最核心的一个类。
ThreadPoolExecutor 继承了 AbstractExecutorService 类,并提供了四个构造
器,事实上,通过观察每个构造器的源码具体实现,发现前面三个构造器都是调
用的第四个构造器进行的初始化工作。
构造器中各个参数的含义
七大核心参数:1.核心线程池大小  2.最大核心线程池大小  3.超时多久没人使用就会释放
4.超时单位   5.阻塞队列  6.线程工厂,创建线程的,一般不动   7.拒绝策略
corePoolSize :核心池的大小,这个参数跟后面讲述的线程池的实现原理有非常大的关系。在创建了线程池后,默认情况下,在创建了线程池后,线程池中的线程数为 0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线 程数目达到 corePoolSize 后,就会把到达的任务放到缓存队列当中;除非调用了 prestartAllCoreThreads()或者 prestartCoreThread()方法,从这 2 个方法的名 字就可以看出,是预创建线程的意思,即在没有任务到来之前就创建 corePoolSize 个线程或者一个线程。
maximumPoolSize :线程池最大线程数,这个参数也是一个非常重要的参数, 它表示在线程池中最多能创建多少个线程;
keepAliveTime :表示线程没有任务执行时最多保持多久时间会终止。默认情 况下,只有当线程池中的线程数大于 corePoolSize 时,keepAliveTime 才会起 作用,直到线程池中的线程数不大于 corePoolSize,即当线程池中的线程数大 于corePoolSize 时,如果一个线程空闲的时间达到 keepAliveTime,则会终止, 直到线程池中的线程数不超过 corePoolSize。
unit :参数 keepAliveTime 的时间单位,有 7 种取值,在 TimeUnit 类中有 7
种静态属性:

 

workQueue :一个阻塞队列,用来存储等待执行的任务,这个参数的选择也很 重要,会对线程池的运行过程产生重大影响。
threadFactory :线程工厂,主要用来创建线程。
handler :表示当拒绝处理任务时的策略。
       提交任务到线程池的执行过程:一般只开核心线程,当阻塞队列满了以后,将会启动最大核心线程池大小。当处于最大核心线程下时,依然有线程要加入阻塞队列,启动拒绝策略。

 

线程池中的队列
线程池有以下工作队列:
ArrayBlockingQueue: 是一个用数组实现的有界阻塞队列,创建时必须设置长度,,按 FIFO 排序量。
LinkedBlockingQueue: 基于链表结构的阻塞队列,按 FIFO 排序任务,容量可以选择进行设置,不设置是一个最大长度为 Integer.MAX_VALUE。
线程池的拒绝策略
构造方法的中最后的参数 RejectedExecutionHandler 用于指定线程池的拒绝策略。当请求任务不断的过来,而系统此时又处理不过来的时候,我们就需要采 取对应的策略是拒绝服务。
默认有四种类型:
AbortPolicy 策略:该策略会直接抛出异常,阻止系统正常工作。
CallerRunsPolicy 策略:只要线程池未关闭,该策略在调用者线程中运行当前的 任务(如果任务被拒绝了,则由 提交任务的线程(例如:main) 直接执行此任务)。
DiscardOleddestPolicy 策略:该策略将丢弃最老的一个请求,也就是即将被执 行的任务,并尝试再次提交当前任务。
DiscardPolicy 策略:该策略丢弃无法处理的任务,不予任何处理。
execute 与 submit 的区别
执行任务除了可以使用 execute 方法还可以使用 submit 方法。它们的主要区别是:execute 适用于不需要关注返回值的场景,submit 方法适用于需要关注返 回值的场景。
关闭线程池
关闭线程池可以调用 shutdownNow 和 shutdown 两个方法来实现。
shutdownNow:对正在执行的任务全部发出 interrupt(),停止执行,对还未开始执行的任务全部取消,并且返回还没开始的任务列表。
shutdown:当我们调用 shutdown 后,线程池将不再接受新的任务,但也不会 去强制终止已经提交或者正在执行中的任务。
最大线程到底如何定义(调优)最大值
1.CPU密集型,几核就是几,可以保持CPU的效率最高!
2.IO密集型,判断程序中十分耗费IO的线程个数,一般设置为其的两倍。
获得当前计算机的CPU核数
Runtime.getRuntime().availableProcessors(); //获得CPU核数

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java ~ Reference ~ FinalizerHistogram【总结】

前言 文章 相关系列:《Java ~ Reference【目录】》(持续更新)相关系列:《Java ~ Reference ~ FinalizerHistogram【源码】》(学习过程/多有漏误/仅作参考/不再更新)相关系列:《Java ~ Referenc…

通俗讲解元学习(Meta-Learning)

元学习通俗的来说,就是去学习如何学习(Learning to learn),掌握学习的方法,有时候掌握学习的方法比刻苦学习更重要! 下面我们进行详细讲解 1. 从传统机器学习到元学习 传统的机器学中,我们选择一个算法&…

Fiddler汉化(一箭三连)

我安装的fiddler 操作系统是:Win10 64Bit 操作系统的版本号是:v5.0.20194.41348 for .NET 4.6.1 fiddler下载地址: 我用夸克网盘分享了「02-Web调试工具-FiddlerSetup.exe」,点击链接即可保存。 链接:https://pan.quar…

python调用go语言的代码

最近在学习上述Python,go语言,研究下互相调用的事项,在windows下使用 linux下: gcc -o libpycall.so -shared -fPIC pycall.c windows下: gcc -o libpycall.dll -shared -fPIC pycall.c 但是实际的过程中编译成*.so…

使用扩展卡尔曼滤波(EKF)融合激光雷达和雷达数据(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

复习js的Object.defineProperty()

今天在看尚硅谷的Vue2时,讲到了Object.defineProperty()方法,有点忘了,所以找资料复习了一下。 总说 Object.defineProperty()是一种用于定义对象属性的JavaScript方法,它允许开发人员精确控制一个属性的行为,并可以…

【MySQL】库表的基本操作

文章目录 数据库的基本操作增查删改切入查看当前使用数据库 数据表的基本操作增查所有表查指定表查表字段信息删表改表名改字段名改字段属性增字段删字段 数据表的约束主键约束(PRIMARY KEY)非空约束(NOT NULL)默认值约束(DEFAULT)唯一性约束(UNIQUE)外键约束(FOREIGN KEY)删除…

VSCode 配置 C++ 环境

文章目录 VSCode 配置 C 环境1. 配置 C 编译器1.1 下载 MinGW1.2 添加环境变量1.3 测试 2. 配置编辑器 VSCode2.1 下载 VSCode2.2 安装插件2.3 运行代码 3. 优化Reference VSCode 配置 C 环境 VSCode(Visual Studio Code)是一款轻量级的代码编辑器&…

Linux系统之部署Node.js环境

Linux系统之部署Node.js环境 一、Node.js介绍1.1 Node.js简介1.2 npm简介1.3 Node.js官网 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、部署Node.js环境3.1 下载Node.js安装包3.2 解压Node.js安装包3.3 复制二进制文件3.4 配置环境变量3.5 检查node及npm版本 四、NP…

EXCEL的自定义格式,比如 @_ ,一个我很少用的功能的简单总结

目录 前言 1 入口: 2 有用的一些功能 2.1 可以自动在 你输入的字符串前后加 预设内容 2.1.1 具体见下面 2.1.2 对比EXCEL得常用拖动功能 2.2 设置填充下划线 2.2.1 效果如下 2.2.2 问题 2.2.3 下划线的显示问题 2.3 比如 #.## 2.4 比如 000.000 2.5 比…

自动化测试webdriver常用API总结

目录 前言: 1. selenium的简单介绍 2. selnium的下载 3. WebDriver常用API 前言: WebDriver 是一个自动化测试工具,主要用于模拟浏览器行为,实现自动化测试。下面是一些 WebDriver 常用 API 总结: 1. selenium的…

STM32--ESP8266物联网WIFI模块(贝壳物联)--远程无线控制点灯

本文适用于STM32F103C8T6等MCU,其他MCU可以移植,完整资源见文末链接 一、简介 随着移动物联网的发展,各场景下对于物联控制、数据上传、远程控制的诉求也越来越多,基于此乐鑫科技推出了便宜好用性价比极高的wifi物联模块——ESP…

CentOS 7.6安装 MongoDB 5.0.2

1、选择下载地址 进入下载官网 https://www.mongodb.com/try/download/community 选择右侧MongoDB Community Server Version:5.0.2(current) Platform:RedHat / CentOS 7.0 Package:tgz 点击Copy复制 安装位置&am…

爆肝总结,软件测试-常见并发问题+解决方案,测试进阶...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 并发测试的定义 …

LVS负载均衡--NET模式

目录 企业群集应用概率 群集的含义 问题 根据群集所针对的目标差异,可分为三种类型 负载均衡群集(Load Balance Cluster) 高可用群集(High Availability Cluster) 高性能运算群集(High Performance Computer Cluster) 负载均衡群集架构 负载均衡的结构 LV…

XuperChain搭建+报错+注意事项

安装依赖 golang 这里安装的是15-17版本 wget -c https://dl.google.com/go/go1.15.2.linux-amd64.tar.gz -O - | sudo tar -xz -C /usr/local 添加环境变量 这个可以通过添加下面的行到/etc/profile文件(系统范围内安装)或者$HOME/.profile文件(当前用户安装 vim /etc…

论文笔记--GPT-4 Technical Report

论文笔记--GPT-4 Technical Report 1. 报告简介2. 报告概括3 报告重点内容3.1 Predictable Scaling3.2 Capabilities3.3 limitations3.3 Risks & mitigations 4. 报告总结5. 报告传送门6. References 1. 报告简介 标题:GPT-4 Technical Report作者:…

机器学习——单变量线性回归、梯度下降

文章目录 一、机器学习的分类二、线型回归Linear regression(单变量线性回归)三、代价函数3.1 建模误差3.2 平方误差代价函数 Squared error cost function3.3 梯度下降3.4 梯度下降与线性回归相结合 一、机器学习的分类 监督学习:学习数据带…

算法模板(3):搜索(6):做题积累

算法模板(3):搜索(6):做题积累 一、DFS 1. 1113. 红与黑 有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻(上下…

【剑指offer专项突破版】链表篇——“C“

文章目录 前言一.删除链表的倒数第 n 个结点题目分析思路分析细节分析步骤代码 二.链表中环的入口节点题目分析思路分析写法①代码写法②代码: 三.两个链表的第一个重合节点题目分析思路分析代码 四.反转链表题目分析思路分析法①代码法②代码法③代码 五.链表中的两数相加题目…