线程池的工作原理
-
固定线程池:线程池中的线程数是固定的,线程池创建时就已经设定了固定的线程数量。在任务提交时,线程池会将任务分配给空闲的线程执行。如果所有线程都在执行任务,新的任务会被放到任务队列中,直到有线程空闲出来。
-
线程复用:线程池中的线程会被复用,也就是说,线程池中的线程在任务执行完后并不会销毁,而是会被复用来执行其他任务。这能够提高任务的处理效率,避免了频繁创建和销毁线程的开销。
-
队列管理:如果提交的任务超过了线程池中线程的数量,任务会被放入任务队列中。队列有大小限制,超出限制时会根据拒绝策略来处理(例如抛出异常、丢弃任务等)。
代码示例
import java.util.concurrent.*;public class FixedThreadPoolExample {public static void main(String[] args) {ExecutorService executorService = Executors.newFixedThreadPool(13); // 创建一个固定大小为 13 的线程池// 提交多个任务for (int i = 0; i < 20; i++) {int taskId = i;executorService.execute(() -> {System.out.println("任务 " + taskId + " 开始执行, 线程: " + Thread.currentThread().getName());try {Thread.sleep(1000); // 模拟任务执行过程} catch (InterruptedException e) {Thread.currentThread().interrupt();}System.out.println("任务 " + taskId + " 执行完成");});}executorService.shutdown(); // 关闭线程池}
}
代码解释:
-
创建线程池:
Executors.newFixedThreadPool(13)
创建一个固定大小为 13 的线程池。线程池可以同时执行 13 个任务。 -
提交任务:通过
executorService.execute()
方法提交 20 个任务,线程池会把这些任务分配给空闲的线程来执行。如果有超过 13 个任务,其他任务会被放入任务队列中,等待有线程空闲时再执行。 -
关闭线程池:
executorService.shutdown()
会关闭线程池,不再接受新的任务。所有已经提交的任务会继续执行,直到执行完毕。
注意事项:
-
线程池大小:根据任务的数量和执行的需求,线程池大小应该合理设置。创建过多的线程会导致资源竞争和上下文切换的开销;线程池太小则可能导致任务堆积和延迟执行。
-
关闭线程池:通过
shutdown()
或shutdownNow()
来关闭线程池,建议在所有任务完成后关闭线程池。如果线程池不再使用,及时关闭能够释放资源。 -
任务队列:线程池会使用一个任务队列来缓存那些等待执行的任务。如果任务队列满了,你可能会遇到任务拒绝的情况。你可以通过设置自定义的拒绝策略来应对这种情况。
扩展内容
定时任务池
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
这行代码的作用是创建一个大小为 1 的定时任务线程池。ScheduledExecutorService
是 ExecutorService
的一个子接口,它提供了调度任务的功能,包括定时任务和周期性任务的执行。
关键点:
-
定时任务:
ScheduledExecutorService
允许你以固定的延迟时间执行任务,或者按照固定的时间间隔周期性地执行任务。 -
线程池大小:在这个例子中,线程池的大小为 1,意味着线程池中只有一个线程可用于执行任务。如果你提交多个定时任务,它们会依次排队执行。只有一个线程的线程池适用于那些对并发要求不高的任务。
-
常见方法:
-
schedule()
: 用于在指定延迟后执行一个任务。 -
scheduleAtFixedRate()
: 用于按固定频率执行任务,即每隔一定时间执行一次,适用于周期性任务。 -
scheduleWithFixedDelay()
: 用于在执行完一个任务后延迟一定时间再执行下一个任务,适用于任务间有延迟需求的情况。
-
代码示例:
import java.util.concurrent.*;public class ScheduledExecutorServiceExample {public static void main(String[] args) {// 创建一个定时任务线程池,池中只有一个线程ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);// 使用 schedule() 方法定时执行任务scheduledExecutorService.schedule(() -> {System.out.println("任务执行了,延迟 2 秒");}, 2, TimeUnit.SECONDS); // 延迟 2 秒执行任务// 使用 scheduleAtFixedRate() 方法按固定频率执行任务scheduledExecutorService.scheduleAtFixedRate(() -> {System.out.println("周期性任务执行,每 3 秒执行一次");}, 0, 3, TimeUnit.SECONDS); // 初始延迟 0 秒,之后每 3 秒执行一次// 使用 scheduleWithFixedDelay() 方法按固定延迟执行任务scheduledExecutorService.scheduleWithFixedDelay(() -> {System.out.println("任务执行完后,延迟 1 秒再执行下一个任务");}, 0, 1, TimeUnit.SECONDS); // 初始延迟 0 秒,任务之间的间隔 1 秒// 模拟主线程等待一段时间后关闭线程池try {Thread.sleep(10000); // 等待 10 秒,观察任务执行情况} catch (InterruptedException e) {Thread.currentThread().interrupt();}scheduledExecutorService.shutdown(); // 关闭线程池}
}
代码解释:
-
schedule()
方法:用于指定一个任务在指定延迟后执行。这里我们设置了延迟 2 秒后执行任务。 -
scheduleAtFixedRate()
方法:用于周期性地执行任务,初始延迟为 0 秒,每 3 秒执行一次。 -
scheduleWithFixedDelay()
方法:用于按固定的延迟时间执行任务,任务执行完成后会延迟 1 秒再执行下一个任务。 -
shutdown()
:在所有任务完成后,调用shutdown()
方法来关闭线程池,避免资源泄露。
注意事项:
-
线程池的大小:由于线程池的大小为 1,所有提交的任务将依次排队执行。如果有多个周期性任务,它们将按顺序执行,无法并行。如果需要并行执行多个任务,可以增加线程池的大小。
-
任务提交方式:你可以根据需要选择使用
schedule()
,scheduleAtFixedRate()
, 或scheduleWithFixedDelay()
方法。选择合适的方式取决于任务的特性,比如是否是周期性任务,是否需要固定的时间间隔等。 -
关闭线程池:使用
shutdown()
或shutdownNow()
来关闭线程池。要确保所有任务执行完之后再关闭线程池,避免任务被中断。
执行任务方式
executorService.execute(() -> { ... })
是 Java 中使用线程池执行任务的一种方式,它是 ExecutorService
接口中的方法之一。这个方法接受一个实现了 Runnable
接口的任务,并将其提交给线程池执行。
在这个例子中,execute()
方法会提交一个无返回值的任务(即 Runnable
)给线程池执行。当你使用 Lambda 表达式时,() -> { ... }
是一种简洁的写法,表示创建一个匿名 Runnable
实现类。
ExecutorService executorService = Executors.newFixedThreadPool(2); // 创建一个包含两个线程的线程池executorService.execute(() -> {System.out.println("任务开始执行");// 任务逻辑try {Thread.sleep(1000); // 模拟任务执行过程中的等待} catch (InterruptedException e) {Thread.currentThread().interrupt();}System.out.println("任务执行完成");
});executorService.shutdown(); // 关闭线程池
关键点:
-
execute()
方法不会返回值,适用于那些没有返回结果的任务。如果你需要获取任务的执行结果,应该使用submit()
方法,它返回一个Future
对象。 -
Runnable
接口代表一个无返回值的任务,你可以通过 Lambda 表达式或者匿名内部类的方式来实现。 -
ExecutorService
是Executor
接口的子接口,提供了更多的控制方法,如shutdown()
用来关闭线程池。
注意事项:
-
如果线程池已经被关闭,或者正在终止,调用
execute()
提交任务时会抛出RejectedExecutionException
。
eg:
-
如果你希望在任务执行后获取结果,使用
submit()
而不是execute()
,因为submit()
返回一个Future
对象,允许你获取执行结果或者捕获异常。
相关文章:
线程池的工作原理
固定线程池:线程池中的线程数是固定的,线程池创建时就已经设定了固定的线程数量。在任务提交时,线程池会将任务分配给空闲的线程执行。如果所有线程都在执行任务,新的任务会被放到任务队列中,直到有线程空闲出来。 线…...
论文导读 | SOSP23 | Gemini:大模型 内存CheckPoint 快速故障恢复
本期分享的是一篇SOSP 2023论文: Gemini: Fast Failure Recovery in Distributed Training with In-Memory Checkpoints Zhuang Wang (Rice University), Zhen Jia (Amazon Web Services, Inc.), Shuai Zheng (Amazon Web Services), Zhen Zhang (Amazon Web Servic…...
windows 常用命令总结
工作中用到的 Linux 总结(持续更新中...)_linux工作经验-CSDN博客 PS: 推荐使用 powershell 而不是 cmd,因为PowerShell 是一个更先进和功能更强大的工具( powershell 有命令记忆功能,比较方便)…...
【Linux】进程间通信、匿名管道、进程池
一.什么是通信 进程间通信(Inter-Process Communication,IPC),是指在操作系统中,不同进程之间进行数据交换和同步的机制。由于每个进程通常拥有独立的内存空间,进程间无法直接访问对方的内存,因此需要通过特定的机制来实现通信和…...
【Block总结】PlainUSR的局部注意力,即插即用|ACCV2024
论文信息 标题: PlainUSR: Chasing Faster ConvNet for Efficient Super-Resolution作者: Yan Wang, Yusen Li, Gang Wang, Xiaoguang Liu发表时间: 2024年会议/期刊: 亚洲计算机视觉会议(ACCV 2024)研究背景: 超分辨率(Super-Resolution, S…...
35信号和槽_信号槽小结
Qt 信号槽 1.信号槽是啥~~ 尤其是和 Linux 中的信号进行了对比(三要素) 1) 信号源 2) 信号的类型 3)信号的处理方式 2.信号槽 使用 connect 3.如何查阅文档. 一个控件,内置了哪些信号,信号都是何时触发 一…...
现代复古电影海报品牌徽标设计衬线英文字体安装包 Thick – Retro Vintage Cinematic Font
Thick 是一种大胆的复古字体,专为有影响力的标题和怀旧的视觉效果而设计。其厚实的字体、复古魅力和电影风格使其成为电影海报、产品标签、活动品牌和编辑设计的理想选择。无论您是在引导电影的黄金时代,还是在现代布局中注入复古活力,Thick …...
低代码开发平台:飞帆画 echarts 柱状图
https://fvi.cn/711 柱状图这个控件是由折线图的控件改过来的,在配置中,单选框选择柱状图就行了。...
Linux中C++ gdb调试命令
编译可执行文件需要带上-g选项参数 输入回车则重复执行上一次命令; 进入gdb: gdb 程序名运行gdb命令: r打断点命令: b 行号查看断点命令: i b打印变量命令: p 变量名持续查看变量命令: d…...
Python精进系列:从 __name__ 开始了解 python 常见内置变量
目录 引言一、__name__是什么?案例1:直接运行模块案例2:模块被导入 二、__name__的主要用途(一)区分主程序和导入模块案例3:测试代码隔离(二)动态导入模块案例4:根据环境…...
Nacos 服务发现的核心模型有哪些?Service, Instance, Cluster 之间的关系是什么?
Nacos 服务发现的核心模型 Nacos 服务发现的核心数据模型主要围绕以下几个关键概念构建,它们共同构成了服务注册与发现的基础: Namespace (命名空间): 用途: 用于进行环境隔离。比如,你可以为开发环境 (dev)、测试环境 (test) 和生产环境 (p…...
Java程序设计第1章:概述
一、Hello World 1.代码: public class HelloWorld {public static void main(String[] args){System.out.println("Hello World!");} } 2.运行结果: Hello World! 二、输出姓名、学号、班级 1.题目: 编写一个Application&a…...
C++开发工具全景指南
专业编译与调试工具深度解析 2025年4月 编译器套件 GNU Compiler Collection (GCC) GNU编译器套件是自由软件基金会开发的跨平台编译器系统,支持C、C、Objective-C、Fortran、Ada等多种编程语言。作为Linux系统的标准编译器,GCC以其强大的优化能力和…...
Java的Selenium的特殊元素操作与定位之iframe切换
iframe切换 四种切换方式: driver.switchTo().frame(index);driver.switchTo().frame(id);driver.switchTo().frame(name);driver.switchTo().frame(WebElement); 切换之后,回到默认内容页面(否则会找不到元素 driver.switchTo().defaultContent(); //iframe处…...
AI比人脑更强,因为被植入思维模型【42】思维投影思维模型
giszz的理解:本质和外在。我们的行为举止,都是我们的内心的表现。从外边可以看内心,从内心可以判断外在。曾国藩有7个识人的方法,大部分的人在他的面前如同没穿衣服一样。对于我们自身的启迪,我认为有四点&…...
7-12 最长对称子串(PTA)
对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。 输入格式: 输入在一行中给出长度不超过1000的非空字符串。 输出格式&…...
嵌入式AI的本地化部署的好处
嵌入式AI本地化处理(即边缘计算)的核心优势在于将AI算力下沉至设备端,直接处理数据而非依赖云端,这种模式在多个维度上展现出显著价值: 一、数据隐私与安全性提升 1. 敏感数据本地存储 金融、医疗等涉及隐私的行业…...
0基础 | 硬件 | 电源系统 一
降压电路LDO 几乎所有LDO都是基于此拓扑结构 图 拓扑结构 LDO属于线性电源,通过控制开关管的导通程度实现稳压,输出纹波小,无开关噪声 线性电源,IoutIin,发热功率P电压差△U*电流I,转换效率Vo/Vi LDO不适…...
LeetCode详解之如何一步步优化到最佳解法:20. 有效的括号
LeetCode详解系列的总目录(持续更新中): LeetCode详解之如何一步步优化到最佳解法:前100题目录(更新中...)-CSDN博客 LeetCode详解系列的上一题链接: LeetCode详解之如何一步步优化到最佳解法…...
LeetCode18四数之和
代码来源:代码随想录 /*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().*/ int com…...
《K230 从熟悉到...》无线网络
《K230 从熟悉到...》无线网络 STA模式 《庐山派 K230 从熟悉到...》无线网络 无线网络中通常是STA(Station,站点)和AP(Access Point,无线接入点)。 STA(站点) 定义:STA…...
去中心化指数(链上ETF)
去中心化指数(链上ETF) 核心概念 去中心化指数: 类似传统金融的ETF(交易所交易基金),通过一篮子代币分散投资风险,无需主动管理。 核心价值:降低研究成本、分散风险、自动化资产…...
LeeCode题库第1695题
项目场景: 给你一个正整数数组 nums ,请你从中删除一个含有 若干不同元素 的子数组。删除子数组的 得分 就是子数组各元素之 和 。 返回 只删除一个 子数组可获得的 最大得分 。 如果数组 b 是数组 a 的一个连续子序列,即如果它等于 a[l],…...
【LeetCode 热题100】23:合并 K 个升序链表(详细解析)(Go语言版)
🚀 LeetCode 热题 23:合并 K 个升序链表(详细解析) 📌 题目描述 LeetCode 23. Merge k Sorted Lists 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合…...
LeetCode hot 100—删除链表的倒数第N个节点
题目 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1 输出:[]示例 3&…...
超级科学软件实验室(中国) : Super Scientific Software Laboratory (SSSLab)
Super Scientific Software Laboratory (SSSLab) gitee 官网...
2025大唐杯仿真1——车联网
车联网 V2N是指车辆与网络 Uu接口是用户设备(UE)与基站之间的通信接口,用于终端和基站之间的通信 Uu接口可用的是N41频段,归属中国移动 车辆间交互是V2V,频段是PCS PC5接口是一种用于设备间直接通信(D2D…...
云资源合规基线:确保云环境安全与合规的完整指南
1. 引言 随着越来越多的企业将其IT基础设施迁移到云端,确保云资源的安全性和合规性变得至关重要。云资源合规基线是一套最佳实践和标准,旨在帮助组织维护安全、高效且符合法规要求的云环境。本文将深入探讨云资源合规基线的各个方面,为IT管理者和安全专业人士提供全面的指导。…...
1.0 软件测试全流程解析:从计划到总结的完整指南
软件测试全流程解析:从计划到总结的完整指南 摘要 本文档详细介绍了软件测试的完整流程,包括测试计划、测试设计、测试执行、测试报告和测试总结等主要阶段。每个阶段都从目标、主要工作、输出物和注意事项等方面进行了详细说明。通过本文档࿰…...
@reduxjs/toolkit 报错,解决
项目场景: 使用redux存储状态,写一个reducer 问题描述 报错:Uncaught Error: A case reducer on a non-draftable value must not return undefined import { createSlice } from "reduxjs/toolkit"; //错误写法 const counterS…...
C++蓝桥杯实训篇(二)
片头 嗨咯~小伙伴们!今天我们来一起学习算法和贪心思维,准备好了吗?咱们开始咯! 第1题 数位排序 对于这道题,我们需要自己写一个排序算法,也就是自定义排序,按照数位从小到大进行排序。 举一…...
YY forget password
YY forget password 老早以前的语音工具,游戏团队协作工具...
Kafka 如何解决消息堆积问题?
Kafka 的消息堆积问题是实际生产中经常遇到的情况,尤其在高并发、大流量、消费者故障或处理速度慢的情况下,非常容易出现。 下面我从诊断 解决方案 实战技巧三步帮你梳理清楚: 🔍 一、先判断:是否真的“堆积”&…...
如何通过优化HMI设计大幅提升产品竞争力?
一、HMI设计的重要性与竞争力提升 HMI(人机交互界面)设计在现代产品开发中扮演着至关重要的角色。良好的HMI设计不仅能够提升用户体验,还能显著增强产品的竞争力。在功能趋同的市场环境中,用户体验成为产品竞争的关键。HMI设计通…...
2025大唐杯仿真4——信令流程
Preamble请求...
MyBatis Plus 在 ZKmall开源商城持久层的优化实践
ZKmall开源商城作为基于 Spring Cloud 的高性能电商平台,其持久层通过 MyBatis Plus 实现了多项深度优化,涵盖分库分表、缓存策略、分页性能、多租户隔离等核心场景。以下是具体实践总结: 一、分库分表与插件集成优化 1. 分库分表策略 Sh…...
Qt多线程从基础到性能优化
一、为什么需要多线程开发 现代应用程序的性能需求 CPU多核架构的有效利用 复杂任务的解耦与响应式界面保持 二、Qt线程创建四大方式 1. 继承QThread重写run() class WorkerThread : public QThread {void run() override {// 耗时操作qDebug() << "Thread ID…...
Spring常见问题复习
############Spring############# Bean的生命周期是什么? BeanFactory和FactoryBean的区别? ApplicationContext和BeanFactory的区别? BeanFactoryAware注解,还有什么其它的Aware注解 BeanFactoryAware方法和Bean注解的方法执行顺…...
股票日数据使用_未复权日数据生成前复权日周月季年数据
目录 前置: 准备 代码:数据库交互部分 代码:生成前复权 日、周、月、季、年数据 前置: 1 未复权日数据获取,请查看 https://blog.csdn.net/m0_37967652/article/details/146435589 数据库使用PostgreSQL。更新日…...
【C++】从零实现Json-Rpc框架(2)
目录 JsonCpp库 1.1- Json数据格式 1.2 - JsonCpp介绍 • 序列化接口 • 反序列化接口 1.3 - Json序列化实践 JsonCpp使用 Muduo库 2.1 - Muduo库是什么 2.2 - Muduo库常见接口介绍 TcpServer类基础介绍 EventLoop类基础介绍 TcpConnection类基础介绍 TcpClient…...
JVM虚拟机篇(二):深入剖析Java与元空间(MetaSpace)
这里写目录标题 JVM虚拟机篇(二):深入剖析Java与元空间(MetaSpace)一、引言二、全面认识Java2.1 Java的起源与发展历程2.2 Java的特性2.2.1 简单性2.2.2 面向对象2.2.3 平台无关性2.2.4 健壮性2.2.5 安全性2.2.6 多线程…...
NDK开发:音视频处理基础
音视频处理基础 一、音视频基础 1.1 音视频基本概念 视频编码格式 H.264/AVCH.265/HEVCVP8/VP9AV1音频编码格式 AACMP3PCMOPUS封装格式 MP4FLVMKVTS1.2 音视频处理流程 视频处理流程 采集(Camera/Screen)预处理(美颜/滤镜)编码(H.264/H.265)封装传输/存储音频处理流程 …...
【数字电路】第一章 数制和码制
一、数码的基本概念 1.数制 2.码制 二、几种常用的数制 三、不同数制间的转换 八进制和十六进制间通常不直接进行转换,而是先转换成二进制或十进制然后再进行转换。 1.任意进制→十进制(N—十转换) 2.十进制→任意进制(十—N转换…...
软件工程面试题(二十九)
1、Internet的最顶级的商业域名叫什么? 答: .com 2、GC是什么,为什么要使用它? 垃圾回收 (garbage collection, GC) 一个跟踪过程,它传递性地跟踪指向当前使用的对象的所有指针,以便找到可以引用的所有对象,然后重新使用在此跟踪过程中未找到的任何堆内存。公共语言运行…...
6.第二阶段x64游戏实战-分析人物状态
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:5.第二阶段x64游戏实战-动态模块地址 人物状态是与角色相关的,如果…...
Synopsys:设计对象
相关阅读 Synopsyshttps://blog.csdn.net/weixin_45791458/category_12812219.html?spm1001.2014.3001.5482 对于Synopsys的EDA工具(如Design Compiler、PrimeTime、IC Compiler)等,设计对象(Design Objects)是组成整个设计的抽象表示&…...
Redis数据结构之Hash
目录 1.概述2.常见操作2.1 H(M)SET/H(M)GET2.2 HGETALL2.3 HDEL2.4 HLEN2.5 HEXISTS2.6 HKEYS/HVALS2.7 HINCRBY2.8 HSETNX 3.总结 1.概述 Hash是一个String类型的field(字段)和value(值)的映射表,而且value是一个键值对集合,类似Map<String, Map<…...
【VUE】RuoYi-Vue3项目结构的分析
【VUE】RuoYi-Vue3项目结构的分析 1. 项目地址2. RuoYi-Vue3项目结构2.1 整体结构2.2 package.json2.2.1 🧾 基本信息2.2.2 🔧 脚本命令(scripts)2.2.3 🌍 仓库信息2.2.4 📦 项目依赖(dependenc…...
libreoffice-help-common` 的版本(`24.8.5`)与官方源要求的版本(`24.2.7`)不一致
出现此错误的原因主要是软件包依赖冲突,具体分析如下: ### 主要原因 1. **软件源版本不匹配(国内和官方服务器版本有差距) 系统中可能启用了第三方软件源(如 PPA 或 backports 源),导致 lib…...
5.数据手册解读——共模电感
目录 1 共模电感的工作原理 2 核心参数解读 2.1 电气参数 2.2 阻抗特性 共模电感(Common mode Choke),也叫共模扼流圈,是在一个闭合磁环上对称绕制方向相反、匝数相同的线圈。理想的共模扼流圈对L(或N)与E之间的共模干扰具有抑…...