Java中的线程池

news/2024/5/21 0:08:43

CPU有限,一个CPU只能执行一个线程,在有限的资源下,大量的线程都在等待。通过线程池去管理、创建线程。

一、线程池的核心参数(七个)

救急线程 = 非核心线程 = 临时线程

流程:当任务提交过来之后,先去判断核心线程是否已满,没满则直接通过核心线程去完成

   当核心线程满了,去看阻塞队列,阻塞队列没满,则直接放进去,如果阻塞队列满了,则去判断当前线程数是否小于最大线程数(判断有没有临时线程),是的话(有的话)则创建临时线程去执行,没有的话直接触发拒绝策略。

当然如果是按照线程1,2,3提交,当1,2在阻塞队列的时候,3被临时线程去执行,就有3在1,2之前去完成。

同时,每当核心线程或临时线程执行完任务都会去检查阻塞队列是否有需要执行的线程,如果有则使用核心或非核心线程去执行。

如何确定核心线程数?

IO密集型(读取文件多,文件读写、DB读写、网络请求):2*最大并行数 + 1

CPU密集型(计算多,Json转换):最大并行数+1

【计算型的任务需要占用大量的CPU,需要减少线程数目,减少线程的切换来增加效率】

【加1是候补,防止前边有线程出问题,这个线程就可以代替】

二、线程中有哪些常见的阻塞队列

阻塞队列有界的意思是:在创建队列的时候可以指定大小

LinkedBlockingQueue底层是一个单向链表

在创建LinkedBlockingQueue的时候如果不指定大小,则默认给Integer.MAX,有风险,所以要自己设值

两把锁和一把锁的区别就是:
链表可以在两头同时操作数据,因为是两把不一样的锁,而数组只能同时操作一个地方,因为大家公用一把锁。

三、线程池的种类

JUC包下的Executors类提供了四种常见的创建连接池的静态方法

1.创建使用固定线程数的线程池

核心线程数 = 最大线程数 , 阻塞队列没有给初始容量【默认为Integer的最大值】

适用于任务量【需要几个线程】已知,可以控制线程最大并发数,超出的线程在队列中等待

通过内部类重写run方法编写一个子线程任务,创建一个线程池,通过submit去提交任务

2.单线程化的线程池

核心线程数和最大线程数都是1 , 阻塞队列容量也是默认的

适用于按照指定顺序执行的任务

3.可缓存线程池

没有核心线程数,最大线程数为Integer的最大值,且阻塞队列不存储任何元素,来了新线程之后,判断是否有临时线程存活,有的话直接用,没有的话则创建临时线程去执行

适用于任务数比较密集,但是每个任务的执行时间比较短【过长的话,就可能会一直创建临时线程….占用内存】

这种结构设计目的可能是为了在无任务是快速回收线程,有任务时可以使用临时线程数大量执行任务

4.提供了“延迟”和“周期执行”功能的线程池

通过schedule方法提交任务到线程池中

execute提交一个没有返回值的线程,submit有返回值,用future类型接受

四 、为什么不推荐用Executors去创建线程池

Executors类下的SingleThreadPool和FixedThreadExecutors中它们的阻塞队列大小为默认【Integer的最大值】,

可能会堆积大量的请求,从而OOM

而CacheThreadPool中的最大线程数为默认【Integer的最大值】,

可能会造成大量的线程,从而OOM

一般推荐自定义创建线程池【通过new ThreadPoolExecutor,自己往里面填写七个参数】

五、线程池使用的场景

 异步调用【主线程中获取【从线程池中】一个新的线程去调用】

为了避免下一级方法影响上一级方法(性能考虑),可使用异步线程调用下一级方法【当然前提是上一级方法不依赖下一级方法的返回值】,这样可以提升方法响应时间

用SpringBoot框架中的@Async注解实现异步调用【在启动类上也要标注@EnableAsync】

项目中一般都是将线程池额外配置成一个Config类,配置成Bean,并给了一个名称

在需要被异步调用的逻辑上加@Async注解【同时标注用的哪个线程池】


http://www.mrgr.cn/p/01541872

相关文章

2024年3月份宠物行业线上市场数据分析:市场呈现出精细化、品质化趋势

近些年来,养宠物的家庭越来越多,宠物经济也逐渐衍生开来。宠物经济主要是围绕宠物产生的一整条产业链,包括宠物食品、宠物家居、宠物美容和最近火起来的宠物保险等多个领域。目前随着居民人均收入的提高,宠物市场也得到稳步发展。…

【NodeMCU实时天气时钟温湿度项目 1】连接点亮SPI-TFT屏幕和UI布局设计

前言 从今天开始,我们详解介绍制作实时天气时钟项目的方法步骤,主要分以下几个专题分别进行:(1)连接点亮SPI-TFT屏幕和UI布局设计;(2)NodeMCU的WIFI模式设置及连接;&…

docker搭建mysql集群实现主从复制

前言 随着业务的增长,一台数据服务器已经满足不了需求了,负载过重。这个时候就需要减压了,实现负载均衡和读写分离,一主一丛或一主多从。 主服务器只负责写,而从服务器只负责读,从而提高了效率减轻压力。 …

1-zabbix概述

1.zabbix概述 zabbix支持的监控方式: agent:通过代理程序进行监控,如果被监控对象支持对应的agent,推荐首选这种方式。 ssh/telnet:通过远程控制协议进行通讯,比如ssh或者telnet。 SNMP:通过SNMP协议(简单网络管理协议)与被监控对象进行通讯,用这个方式监控路由器和交…

6-监控类型_ZBX_JMX_SNMP_IPMI

6.监控类型 ZBX JMX SNMP IPMIZBX 监控类型: * 作用:ZBX 监控类型是 Zabbix 自身的一种监控方式,它通过 Zabbix Agent 主动采集被监控设备的性能数据,并将数据发送给 Zabbix 服务器进行分析和显示。 * 特点:ZBX 监控类型能够实时地、高效地监控主机,适用于需要精细控制和…

百面算法工程师 | 支持向量机面试相关问题——SVM

本文给大家带来的百面算法工程师是深度学习支持向量机的面试总结,文章内总结了常见的提问问题,旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中,我们还将介绍一些常见的深度学习算法工程师面试问题,并提供参考的回答…

Qt QInputDialog详解

1.简介 QInputDialog是一个对话框类,用于从用户那里获取一个单一的值。这个值可以是字符串、数字、或者一个列表中的选项。QInputDialog提供了一个方便的方式来快速创建一个输入对话框,无需自己从头开始构建。 QInputDialog支持多种输入类型&#xff1…

cluster_网络

cluster 网络service 网络 当service和endpoint被创建时,kube-proxy会自动创建相应的转发规则,使得访问service的请求被转发到endpoint kube-api-server --service-cluster-ip-range ipNet(Default:10.0.0.0/24)

js逆向) 某音cookie中的__ac_signature

原文链接:https://mp.weixin.qq.com/s/NJjU7dqA1g0-_xFmr1nrIg 前言 上一篇文章测试了多个补环境的框架(多个开源的js补环境框架测试),这篇来说一下具体怎么补。用__ac_signature做测试,这个相对简单一点。 逆向 先定位cookie生成的位置,清空cookie然后刷新网页,可以看到有…

开源免费的定时任务管理系统:Gocron

Gocron:精准调度未来,你的全能定时任务管理工具!- 精选真开源,释放新价值。 概览 Gocron是github上一个开源免费的定时任务管理系统。它使用Go语言开发,是一个轻量级定时任务集中调度和管理系统,用于替代L…

Outrageously Large Neural Networks The Sparsely-Gated Mixture-of-Experts Layer

目录概MoE训练Shazeer N., Mirhoseini A., Maziarz K., Davis A., Le Q., Hinton G. and Dean J. Outrageously large neural networks: The sparsely-gated mixture-of-experts layer. ICLR, 2017.概 Mixture-of-Experts (MoE). MoE通过一 gating network 选择不同的 expert: …

什么样的人能上百度词条

百度百科是一个向所有互联网用户开放的平台,任何人都可以创建或编辑词条。然而,并不是所有的人物或事物都能被收录到百度百科中,它有一定的收录标准和审结的关于哪些人或事物能上百度百科的条件和流程。 百度百科的收录标准 知名度和影响力&…

PV-PVC

PV & PVC https://blog.csdn.net/bdkl9998/article/details/106304255PersistentVolume(PV) 是由管理员设置的存储,是集群的一部分,它不属于任何命名空间 PV的生命周期独立于使用它的pod的生命周期 PV更像是一种储备资源,先创建,有PVC需要它时才会被使用 PV可以是多种类…

emptyDir-gitRepo

emptyDir & gitRepo k8s存储类型分类(卷的类型) 临时存储 emptyDir 用于存储临时数据的简单空目录 gitRepo 通过检出Git仓库的内容来初始化的卷持久存储 hostPath 用于将目录从工作节点的文件系统挂载到pod中 nfs …

STM32 ADC学习

ADC Analog-to-Digital Converter,即模拟/数字转换器 常见ADC类型 分辨率和采样速度相互矛盾,分辨率越高,采样速率越低。 ADC的特性参数 分辨率:表示ADC能辨别的最小模拟量,用二进制位数表示,比如8,10…

中间件集群部署

中间件集群部署中间件集群部署 1)反向网关配置 2)运行反向网关和中间件,开启顺序不分先后3)通过反向网关,以指定负载均衡方式访问中间件 本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/18183673

机台数据管控怎么做,能够提高效率促进企业快速发展?

机台数据管控是制造企业信息化管理的重要组成部分,它涉及对生产设备(机台)所产生的数据进行有效的收集、存储、处理和应用。良好的机台数据管控能够帮助企业提高生产效率、降低成本、优化资源配置以及保障生产安全。以下是机台数据管控的几个…

自定义表单工作流的优势介绍

今天,就跟大家一起分享低代码技术平台以及自定义表单工作流的相关知识。当前,应用低代码技术平台可以助力企业提高效率,降低开发成本,实现个性化场景定制,因而越来越得到了客户的信赖与喜爱。很多客户朋友询问自定义表单工作流的优势和特点,为了帮助大家解决这个疑问,今…

746-便携式8路高频电压电流信号测试仪

便携式8路高频电压电流信号测试仪一、平台简介便携式手提8路高频电压电流信号测试仪,以FPGA AD卡和X86主板为基础,构建便携式的手提设备。FPGA AD卡是以Kintex-7XC7K325T PCIeX4的AD卡,支持8路24bit AD采集。北京太速科技,平台默认操作系统为win7 64位系统;具备丰富的外设…

Unity EventSystem入门

概述 相信在学习Unity中,一定有被UI事件困扰的时候把,当添加UICanvas的时候,Unity会为我们自动添加EventSystem,这个是为什么呢,Unity的UI事件是如何处理的呢,在使用各个UI组件的时候,一定有不…