当前位置: 首页 > news >正文

【JAVA入门】Day48 - 线程池

【JAVA入门】Day48 - 线程池


文章目录

  • 【JAVA入门】Day48 - 线程池
    • 一、线程池的主要核心原理
    • 二、自定义线程池
    • 三、线程池的大小


        我们之前写的代码都是,用到线程的时候再创建,用完之后线程也就消失了,实际上这是不对的,它会浪费计算机的内存和运算资源。
        线程池的出现就是为了解决这个问题,线程池在收到任务后,会派出一个空闲线程进行处理,处理完毕后,该线程又会回到线程池;如果没处理完时又来了新的任务,那么它就再派出一个线程进行处理,但最后,所有的线程都会再次回到线程池,没有产生任何浪费。
        线程池虽然方便,但也是有上限的,这个上限可以由我们自己设置,如果提交任务时池子里没有空闲线程,剩下的线程只能在外等待。

一、线程池的主要核心原理

① 创建一个池子,池子中是空的。
② 提交任务时,池子会创建新的线程对象,任务执行完毕,线程归还给池子。下次再提交任务时,不需要创建新的线程,直接复用已有的线程即可。
③ 如果提交任务时,池子中没有空闲线程,也无法创建新的线程,任务就会排队等待。

如果要用代码创建线程池,我们需要用到一个新的工具类——Executors。
在这里插入图片描述

代码实现如下:

package ExecutorsDemos;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class MyThreadPoolDemo {public static void main(String[] args) {/*public static ExecutorService newCachedThreadPool()                     创建一个没有上限的线程池public static ExecutorService newFixedThreadPool(int nThreads)          创建一个上限为nThreads的线程池*///1.获取线程池对象ExecutorService pool1 = Executors.newCachedThreadPool();//2.提交任务pool1.submit(new MyRunnable());pool1.submit(new MyRunnable());pool1.submit(new MyRunnable());pool1.submit(new MyRunnable());pool1.submit(new MyRunnable());//3.销毁线程池//pool1.shutdown();//4.创建一个有上限的线程池ExecutorService pool2 = Executors.newFixedThreadPool(3);}
}

二、自定义线程池

        线程池创建的构造方法 ThreadPoolExecutor() 最多可达7个参数。如果将线程池比作经营饭店,那么这七个参数对应下面七种要素。
在这里插入图片描述
        自定义线程池的运行情况和你提交的任务数量有关,假设有一个自定义线程池,核心线程有3个,临时线程有3个,现在根据不同任务数量进行处理。
1.提交3个任务,线程池只需动用3个核心线程分别执行即可。
在这里插入图片描述

2.提交5个任务时,此时前3个任务分别被3个核心线程包揽,但是剩下两个任务并没有核心线程可以支持,这时候线程池却不创建临时线程来干活,因此后2个任务只能排队等待。

在这里插入图片描述
3.提交8个任务时,此时前3个任务被3个核心线程包揽,然后剩下3个任务去队列里排队,把长度为3的队列也占满了,此时还有2个任务没有去处,这个时候线程池才会创建2个临时线程来处理任务七和任务八。
在这里插入图片描述
由这个案例可以知道,先提交的任务不一定优先执行。
4.提交10个任务时,前3个任务被3个核心线程包揽,后3个任务被放入队伍排队,再3个任务被临时线程包揽,此时还剩1个任务,此时这个任务没有线程可以处理,只能触发任务拒绝策略。

在这里插入图片描述
Java 中默认的策略就是:丢弃任务并抛出异常,其他三个策略了解一下就行。
在这里插入图片描述

        自定义线程池的构造方法代码实现如下所示:

package ExecutorsDemos;import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;public class ThreadPoolExecutorDemo1 {/*ThreadPoolExecutor参数一:核心线程数量不能小于0参数二:最大线程数不能小于等于0,最大数量>=核心线程数量参数三:空闲线程最大存活时间不能小于0参数四:时间单位用TimeUnit指定参数五:任务队列不能为null参数六:创建线程工厂不能为null参数七:任务的拒绝策略不能为null*/public static void main(String[] args) {ThreadPoolExecutor pool = new ThreadPoolExecutor(3, //核心线程数量,不能小于06,  //最大线程数,不能小于0,最大数量 >= 核心线程数60,  //空闲线程最大存活时间TimeUnit.SECONDS,   //时间单位,这里是一个常量"秒"new ArrayBlockingQueue<>(3),    //阻塞队列,长度为3Executors.defaultThreadFactory(),     //创建线程工厂new ThreadPoolExecutor.AbortPolicy()  //任务的拒绝策略,它是一个内部类);}
}

三、线程池的大小

        线程池多大合适呢?这个我们一般有专门的公式。
在这里插入图片描述
        一个4核8线程的CPU,最大并行数是8。
在这里插入图片描述

相关文章:

【JAVA入门】Day48 - 线程池

【JAVA入门】Day48 - 线程池 文章目录 【JAVA入门】Day48 - 线程池一、线程池的主要核心原理二、自定义线程池三、线程池的大小 我们之前写的代码都是&#xff0c;用到线程的时候再创建&#xff0c;用完之后线程也就消失了&#xff0c;实际上这是不对的&#xff0c;它会浪费计算…...

图像亮度均衡算法

图像亮度均衡算法 图像亮度均衡算法的作用是提升图像的对比度和细节&#xff0c;使得图像的亮度分布更加均匀&#xff0c;从而改善视觉效果。通过调整亮度值&#xff0c;可以更好地揭示图像中的细节&#xff0c;尤其在低光或高光条件下的图像处理。 常见的图像亮度均衡算法包括…...

C++中的new与delete

目录 1.简介 2.底层 1.简介 new是升级版的malloc&#xff0c;它会先开空间再去调用构造函数。 delete是升级版的free&#xff0c;它会先调用析构函数再free掉空间。 class A { public:A(int a10, int b10){a a1;b b1;}private:int a;int b; };int main() {//new会先开空间…...

在HTML中添加视频

在HTML中添加视频&#xff0c;你可以使用<video>标签。这个标签允许你在网页上嵌入视频内容&#xff0c;并支持多种视频格式&#xff0c;如MP4、WebM和Ogg等。不过&#xff0c;由于浏览器对视频格式的支持程度不同&#xff0c;因此通常建议提供多种格式的视频文件&#x…...

YoloV10 训练自己的数据集(推理,转化,C#部署)

目录 一、下载 三、开始训练 train.py detect.py export.py 超参数都在这个路径下 四、C#读取yolov10模型进行部署推理 如下程序是用来配置openvino 配置好引用后就可以生成dll了 再创建一个控件&#xff0c;作为显示 net framework 4.8版本的 再nuget工具箱里下载 …...

Science Robotic 内在触觉实现直观的物理人机交互

触觉传感器和电子皮肤是为机器人提供物理交互感的常见设备&#xff0c;但当用于机器人的大面积覆盖时&#xff0c;它们会变得复杂且昂贵。德国宇航中心近期发表的Science Robotics研究工作&#xff0c;使用内部高分辨率关节力扭矩传感器&#xff0c;在机械臂中实现了固有的全身…...

string类(C++)

哈喽各位&#xff01;&#xff0c;久违了&#xff0c;最近怎么样捏&#xff0c;本次进入C的string类&#xff0c;加油加油呀&#xff01; 随记&#xff1a;鼓励创新&#xff0c;宽容失败&#xff01; 1.标准库的string类 1.1string类的了解 string的文献参考链接-->strin…...

【C语言】自定义类型——结构体

目录 一、结构体的类型的声明 二、结构体变量的创建和初始化 三、匿名结构体类型 四、结构体自引用 五、结构体内存对齐 &#xff08;1&#xff09;对齐规则 &#xff08;2&#xff09;计算结构体大小练习 &#xff08;3&#xff09;需要内存对齐的原因 &#xff08;4…...

MySQL练手题--日期连续类型(困难)

一、准备工作 Create table If Not Exists Failed (fail_date date); Create table If Not Exists Succeeded (success_date date); Truncate table Failed; insert into Failed (fail_date) values (2018-12-28); insert into Failed (fail_date) values (2018-12-29); inser…...

【AD24报错】运行DRC后出现 Un-Routed Net Constraint ### Net Not Assigned 的解决方案

AD24在运行PCB设计规则检查&#xff08;DRC&#xff09;后报错 Un-Routed Net Constraint ### Net Not Assigned 的解决方案 一、解决方案二、可能会报错Dead Copper的因素三、可能会报错Un-Routed Net Constraint的因素 Un-Routed Net Constraint ### Net Not Assigned 的解决…...

Linux嵌入式驱动开发指南(速记版)---Linux基础篇

第一章 Ubuntu系统入门 1.1 Linux磁盘管理 1.1.1 Linux磁盘管理基本概念 关键词&#xff1a; Linux 磁盘管理 挂载点 /etc/fstab文件 分区 ls /dev/sd* 联系描述&#xff1a; Linux 磁盘管理体系通过“挂载点”概念替代了 Windows 中的“分区”概念&#xff0c;将硬盘部分以文…...

PDF——压缩大小的方法

方法一&#xff1a;QQ浏览器->格式转换->PDF转纯图PDF...

无监督神经组合优化的扩散模型框架

文章目录 Abstract1. Introduction2. Problem Description2.1 无监督神经组合优化3. Neural Probabilistic Optimization Objective for Approximate Likelihood Models3.1 具有联合变分上界的训练扩散模型Abstract 从离散集合的不可处理分布中进行采样,而不依赖相应的训练数据…...

Web前端开发

首先打开&#xff0c;VS code新建文件夹&#xff0c;命名为index.HTML&#xff0c;然后先对内容进行输入&#xff0c;也就是在波蒂里面进行输入&#xff0c;将社会主义核心价值观的基本内容输入好&#xff0c;然后在页面呈现的效果是这样的 因为有一个alert警告框标签&#xff…...

transformer模型进行英译汉,汉译英

上面是在测试集上的表现 下面是在训练集上的表现 上面是在训练集上的评估效果 这是在测试集上的评估效果,模型是transformer模型,模型应该没问题,以上的是一个源序列没加结束符和加了结束符的情况。 transformer源序列做遮挡填充的自注意力,这就让编码器的输出中每个token的语…...

python 异步读取文件,速度变快了吗

“python 异步读取文件&#xff0c;速度变快了吗” 当我问出这个问题&#xff0c;大部分人第一反应应该是python新人&#xff0c;不懂异步 首先说一下我对异步的理解&#xff1a; asyncio 是 gevent greenlet 的组合gevent 底层使用了libev、selectors 模块&#xff0c;这两…...

【Python】Anaconda插件:Sublime Text中的Python开发利器

上班的时候没人问我苦不苦&#xff0c;下班的时候总有人问为什么走这么早。 Anaconda 是一个专为Sublime Text打造的开源Python开发插件&#xff0c;旨在为开发者提供类似于IDE的丰富功能&#xff0c;提升Python编码效率。该插件提供了代码补全、语法检查、代码片段提示等多项…...

Python酷库之旅-第三方库Pandas(123)

目录 一、用法精讲 546、pandas.DataFrame.ffill方法 546-1、语法 546-2、参数 546-3、功能 546-4、返回值 546-5、说明 546-6、用法 546-6-1、数据准备 546-6-2、代码示例 546-6-3、结果输出 547、pandas.DataFrame.fillna方法 547-1、语法 547-2、参数 547-3、…...

IEEE投稿 IEEE Geoscience and Remote Sensing Letters

IEEE 应用地球观测与遥感专题杂志 journal of Selected Topics in Applied Earth Observations and Remote Sensing IEEE 文章提交流程 撰写文章并准备好图形后&#xff0c;您可以提交文章以供审核。请按照以下步骤完成 IEEE 文章提交流程。 选择目标期刊 如果文章超出期刊范围…...

【华为杯】2024华为杯数模研赛D题 解题思路

题目 大数据驱动的地理综合问题 问题1: 19902020年间中国范围内降水量和土地利用/土地覆被类型的时空演化特征描述? 解题思路 详细分析&#xff1a;此问题要求对降水量&#xff08;连续变化变量&#xff09;和土地利用/覆被&#xff08;离散变化变量&#xff09;进行时空演…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...