多线程-线程池
为什么要使用线程池
在Java中使用线程池的主要原因有以下几点:
-
提高性能:使用线程池可以减少线程的创建和销毁过程的开销。线程的创建和销毁是比较昂贵的操作,如果每次需要执行任务时都创建一个新线程,会造成系统资源的浪费。而线程池可以在程序启动时就创建一定数量的线程,然后重复使用这些线程来执行多个任务。这样可以减少线程创建和销毁的次数,提高系统的性能。
-
控制并发数量:线程池可以控制同时执行的任务数量。通过设置线程池的大小,可以限制并发执行的线程数量,避免系统资源被过度占用,导致整个系统的性能下降。
-
提供可管理的线程:线程池提供了一种管理和监视线程的机制。通过使用线程池,可以方便地对线程进行管理,比如动态调整线程池大小、监控线程的运行状态等。
-
提供线程复用:线程池可以重复利用已有的线程来执行任务,避免了线程的创建和销毁过程,提高了系统的效率。
-
提供任务排队机制:线程池可以提供一个任务队列,用于存放等待执行的任务。当线程池中的线程都在执行任务时,新的任务可以被放入队列中,等待线程空闲时执行。这样可以避免任务因为没有可用线程而被丢弃或者阻塞。
常用的几种线程池以及其中的工作原理
在Java中,常用的几种线程池有以下几种:
-
FixedThreadPool:固定大小的线程池,线程数量固定不变,适合执行长期的任务。如果所有线程都处于繁忙状态,新任务将在队列中等待。
-
CachedThreadPool:可缓存的线程池,线程数量不固定,适合执行大量的短期任务。如果线程池中有可用的线程,就会重用它;如果没有可用线程,就会创建一个新线程。当线程闲置时间超过60秒时,线程将被终止并从池中移出。
-
SingleThreadPool:单线程的线程池,只会创建一个线程来执行任务。适合需要顺序执行任务的场景。
-
ScheduledThreadPool:用于延时或定时执行任务的线程池。可以按照指定的周期来执行任务,或者在指定的延迟时间之后执行任务。
线程池的工作原理如下:
-
创建线程池时,会初始化一定数量的线程,这些线程会一直存在,等待任务的到来。
-
当有任务提交给线程池时,会从线程池中选择一个空闲的线程来执行任务。如果没有空闲线程,任务将被添加到线程池的任务队列中等待执行。
-
如果任务队列已满,且线程池中的线程数未达到线程池的最大线程数限制,线程池会创建一个新的线程来执行任务。
-
当线程执行完任务后,会检查任务队列中是否还有等待执行的任务。如果有,继续从任务队列中选择任务来执行。如果没有,线程将进入空闲状态,等待下一个任务的到来。
-
当线程池不再接收新的任务时,可以调用
shutdown()方法来关闭线程池。关闭线程池后,线程池中的线程会等待任务队列中的任务执行完毕后退出。
线程池启动线程 submit()和 execute()方法有什么不同
submit()方法和execute()方法都是用于向线程池提交任务的方法,但是它们有一些不同之处:
-
返回值不同:submit()方法返回一个Future对象,可以用来获取任务的执行结果或取消任务;而execute()方法没有返回值。
-
异常处理不同:submit()方法会捕获任务执行过程中的异常,并将其封装到Future对象中,通过调用Future对象的get()方法可以获取到异常信息;而execute()方法不会捕获任务执行过程中的异常,如果任务发生异常,线程池会将异常抛出到控制台。
-
可接收的参数类型不同:submit()方法可以接收Callable对象、Runnable对象或Runnable实现类的对象作为参数;而execute()方法只能接收Runnable对象或Runnable实现类的对象作为参数。
实例
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;public class ScheduledThreadPoolExample {public static void main(String[] args) {// 创建ScheduledThreadPool,指定线程池中的线程数为3ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);// 定义一个Runnable任务Runnable task = new Runnable() {@Overridepublic void run() {System.out.println("Task executed at " + System.currentTimeMillis());}};// 使用scheduledExecutorService调度任务,在延迟1秒后开始执行任务,并且每隔3秒重复执行scheduledExecutorService.scheduleAtFixedRate(task, 1, 3, TimeUnit.SECONDS);// 主线程休眠10秒,以便观察任务的执行try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}// 关闭ScheduledThreadPoolscheduledExecutorService.shutdown();}
}
在这个示例中,我们首先创建了一个ScheduledThreadPool,指定线程池中的线程数为3。
然后,我们定义了一个Runnable任务,该任务将在执行时打印当前时间。
接下来,我们使用scheduledExecutorService.scheduleAtFixedRate()方法来调度任务。这个方法接受四个参数:任务、延迟时间、重复间隔和时间单位。在这个例子中,我们将任务延迟1秒后开始执行,并且每隔3秒重复执行一次。
最后,我们让主线程休眠10秒,以便观察任务的执行。然后,我们调用scheduledExecutorService.shutdown()方法来关闭ScheduledThreadPool。
总结
线程池的主要优点如下:
- 重用线程:线程池可以重用已经创建的线程,避免了频繁地创建和销毁线程的开销。
- 控制并发数量:线程池可以限制并发线程的数量,防止过多的线程导致系统资源的浪费或者负载过重。
- 提高响应速度:线程池可以预先创建一组线程,当任务到达时可以立即执行,而不需要等待线程的创建过程,从而提高系统响应速度。
- 提供线程管理和监控功能:线程池可以提供一些管理和监控的方法,用于管理和监控线程的状态和运行情况。
使用线程池时需要注意以下几点:
- 线程池大小的选择:线程池的大小需要根据系统的负载和资源情况进行选择,太小会导致线程不足,任务无法及时处理,太大会导致资源浪费和负载过重。
- 线程池的关闭:在程序结束时需要正确地关闭线程池,释放资源,避免资源泄漏。
- 任务的提交方式:任务的提交可以采用不同的方式,如同步提交、异步提交等,需要根据实际需要进行选择。
- 错误处理机制:线程池需要有相应的错误处理机制,处理任务执行过程中的异常情况。
相关文章:
多线程-线程池
为什么要使用线程池 在Java中使用线程池的主要原因有以下几点: 提高性能:使用线程池可以减少线程的创建和销毁过程的开销。线程的创建和销毁是比较昂贵的操作,如果每次需要执行任务时都创建一个新线程,会造成系统资源的浪费。而线…...
护网期间遇到的几个上传bypass waf、edr
1. weblogic部署war的时候 http/1.1 改成http/2绕过waf 其实jar和ear部署应该也可以,但是我没成功。 weblogoic 部署war死活出错,用linux下的浏览器 linux下打包war马 zip -r zipjob4.zip job/ mv zipjob3.zip zipjob3.war 然后部署成功之后&am…...
简述MVC模式
这里为什么讲MVC模式,是因为在学习的过程中,很多人不知怎的,将观察者模式和MVC混为一谈。MVC模式最开始出现在WEB开发中,该模式能够很好的做到软件模块的高内聚,低耦合,所以其思想逐渐在各个软件开发领域都…...
C#--Mapster(高性能映射)用法
1.Nuget安装Mapster包引用 2.界面XAML部分 <Window x:Class"WpfApp35.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.m…...
mysql实战——Mysql8.0高可用之双主+keepalived
一、介绍 利用keepalived实现Mysql数据库的高可用,KeepalivedMysql双主来实现MYSQL-HA,两台Mysql数据库的数据保持完全一致,实现方法是两台Mysql互为主从关系,通过keepalived配置VIP,实现当其中的一台Mysql数据库宕机…...
关于同一个地址用作两个不同页面时,列表操作栏按钮混淆状态
同一个地址用作两个不同页面时,列表页的操作栏中有好多个按钮,如果用了v-if,可能会导致按钮混淆状态如disabled等属性混乱 解决方法1: 将v-if换成v-show,用了v-show之后意味着所有按钮都在只是在页面上隐藏了 解决方…...
Oracle段延迟分配(Deferred Segment Creation)解析
目录 一、基本概念二、工作原理三、优势四、潜在风险与注意事项五、配置与管理 Oracle段延迟分配(Deferred Segment Creation)是Oracle 11g引入的一项重要特性,旨在优化资源使用和提高数据库管理效率。 一、基本概念 段延迟分配意味着当创建…...
Linux:IPC - System V
Linux:IPC - System V 共享内存 shm创建共享内存shmgetshmctlftok 挂接共享内存shmatshmdt shm特性 消息队列 msgmsggetmsgctlmsgsndmsgrcv 信号量 semSystem V 管理机制 System V IPC 是Linux系统中一种重要的进程间通信机制,它主要包括共享内存 shm&am…...
Laravel 图片添加水印
和这个配合使用 Laravel ThinkPhP 海报生成_laravel 制作海报-CSDN博客 代码 //水印 $x_length $imageInfo[0]; $y_length $imageInfo[1];$color imagecolorallocatealpha($posterImage, 255, 255, 255, 70); // 增加透明度参数alpha$font_size 40; //字体大小 $angle …...
嵌入式进阶——矩阵键盘
🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 矩阵按键原理图按键状态检测单行按键状态检测多行按键状态检测 状态记录状态优化循环优化 矩阵按键 矩阵键盘是一种常见的数字输入…...
请说出vue.cli项目中src目录每个文件夹和文件的用法
在Vue CLI项目中,src目录是存放项目源码及需要引用的资源文件的主要位置。以下是src目录下常见文件夹和文件的用法: components 用途:存放可重用的Vue组件。这些组件通常用于在多个页面或布局中共享UI和功能。特点:组件应该是模块…...
【MySQL精通之路】InnoDB磁盘I/O和文件空间管理(11)
主博客: 【MySQL精通之路】InnoDB存储引擎-CSDN博客 目录 1.InnoDB磁盘I/O 1.1 预读 1.2 双写缓冲区 2.文件空间管理 2.1 Pages, Extents, Segments, and Tablespaces(很重要) 2.2 配置保留文件段页面的百分比 2.3 页与表行的关系 …...
基于springboot+html的二手交易平台(附源码)
基于springboothtml的二手交易平台 介绍部分界面截图如下联系我 介绍 本系统是基于springboothtml的二手交易平台,数据库为mysql,可用于毕设或学习,附数据库 部分界面截图如下 联系我 VX:Zzllh_...
正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-24.3,4 SPI驱动实验-I.MX6U SPI 寄存器
前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…...
【Pandas】数据处理方法
1.数据拆分 pandas.Series.str.extract() Series.str.extract(pat, flags0, expandTrue)[source]extract(提取) 参数 pat: 带分组的正则表达式。 flag: re模块中的标志,例如re.IGNORECASE,修改正则表达式匹配的大小写、空格等 expand: 默认为True&…...
【ArcGIS For JS】前端geojson渲染行政区划图层并加标签
原理 通过DataV工具 生成行政区的geojson(得到各区的面元素数据), 随后使用手动绘制featureLayer与Label,并加载到地图。 //vue3加载geojson数据public/geojson/pt.json,在MapView渲染上加载geojson数据 type是"MultiPolygon"fetc…...
Spring AOP原理详解:动态代理与实际应用
1. Spring AOP概述 1.1 什么是AOP AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在将横切关注点(Cross-Cutting Concerns)从业务逻辑中分离出来。横切关注点是指那些分散在应用程序多…...
死锁的四个必要条件
死锁的四个必要条件如下: 互斥条件(Mutual Exclusion):资源是独占的,即在同一时间内一个资源只能被一个进程或线程所使用,其他进程或线程无法访问该资源。 请求与保持条件(Hold and Wait&#…...
源网络地址转换SNAT
左上角的是访问互联网发送的数据包,第一个是访问,第二个是网页传回来的 3、4项是源端口号和目的端口号(3是随机的(1024-65535),那个是http的网页服务端口就是80) 那么往回传数据的时候源和目的…...
【算法】平衡二叉搜索树的左旋和右旋
树旋转是一种维护平衡树结构的重要操作,主要用于平衡二叉搜索树(如AVL树和红黑树)。树旋转分为左旋和右旋。 1. 树旋转的定义 左旋 (Left Rotation) 左旋操作将节点及其右子树进行调整,使其右子树的左子节点成为根节点…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
