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

多线程-线程池

为什么要使用线程池

      

在Java中使用线程池的主要原因有以下几点:

  1. 提高性能:使用线程池可以减少线程的创建和销毁过程的开销。线程的创建和销毁是比较昂贵的操作,如果每次需要执行任务时都创建一个新线程,会造成系统资源的浪费。而线程池可以在程序启动时就创建一定数量的线程,然后重复使用这些线程来执行多个任务。这样可以减少线程创建和销毁的次数,提高系统的性能。

  2. 控制并发数量:线程池可以控制同时执行的任务数量。通过设置线程池的大小,可以限制并发执行的线程数量,避免系统资源被过度占用,导致整个系统的性能下降。

  3. 提供可管理的线程:线程池提供了一种管理和监视线程的机制。通过使用线程池,可以方便地对线程进行管理,比如动态调整线程池大小、监控线程的运行状态等。

  4. 提供线程复用:线程池可以重复利用已有的线程来执行任务,避免了线程的创建和销毁过程,提高了系统的效率。

  5. 提供任务排队机制:线程池可以提供一个任务队列,用于存放等待执行的任务。当线程池中的线程都在执行任务时,新的任务可以被放入队列中,等待线程空闲时执行。这样可以避免任务因为没有可用线程而被丢弃或者阻塞。

常用的几种线程池以及其中的工作原理

     

在Java中,常用的几种线程池有以下几种:

  1. FixedThreadPool:固定大小的线程池,线程数量固定不变,适合执行长期的任务。如果所有线程都处于繁忙状态,新任务将在队列中等待。

  2. CachedThreadPool:可缓存的线程池,线程数量不固定,适合执行大量的短期任务。如果线程池中有可用的线程,就会重用它;如果没有可用线程,就会创建一个新线程。当线程闲置时间超过60秒时,线程将被终止并从池中移出。

  3. SingleThreadPool:单线程的线程池,只会创建一个线程来执行任务。适合需要顺序执行任务的场景。

  4. ScheduledThreadPool:用于延时或定时执行任务的线程池。可以按照指定的周期来执行任务,或者在指定的延迟时间之后执行任务。

线程池的工作原理如下:

  1. 创建线程池时,会初始化一定数量的线程,这些线程会一直存在,等待任务的到来。

  2. 当有任务提交给线程池时,会从线程池中选择一个空闲的线程来执行任务。如果没有空闲线程,任务将被添加到线程池的任务队列中等待执行。

  3. 如果任务队列已满,且线程池中的线程数未达到线程池的最大线程数限制,线程池会创建一个新的线程来执行任务。

  4. 当线程执行完任务后,会检查任务队列中是否还有等待执行的任务。如果有,继续从任务队列中选择任务来执行。如果没有,线程将进入空闲状态,等待下一个任务的到来。

  5. 当线程池不再接收新的任务时,可以调用shutdown()方法来关闭线程池。关闭线程池后,线程池中的线程会等待任务队列中的任务执行完毕后退出。

线程池启动线程 submit()和 execute()方法有什么不同

      submit()方法和execute()方法都是用于向线程池提交任务的方法,但是它们有一些不同之处:

  1. 返回值不同:submit()方法返回一个Future对象,可以用来获取任务的执行结果或取消任务;而execute()方法没有返回值。

  2. 异常处理不同:submit()方法会捕获任务执行过程中的异常,并将其封装到Future对象中,通过调用Future对象的get()方法可以获取到异常信息;而execute()方法不会捕获任务执行过程中的异常,如果任务发生异常,线程池会将异常抛出到控制台。

  3. 可接收的参数类型不同: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。

 总结

线程池的主要优点如下:

  1. 重用线程:线程池可以重用已经创建的线程,避免了频繁地创建和销毁线程的开销。
  2. 控制并发数量:线程池可以限制并发线程的数量,防止过多的线程导致系统资源的浪费或者负载过重。
  3. 提高响应速度:线程池可以预先创建一组线程,当任务到达时可以立即执行,而不需要等待线程的创建过程,从而提高系统响应速度。
  4. 提供线程管理和监控功能:线程池可以提供一些管理和监控的方法,用于管理和监控线程的状态和运行情况。

使用线程池时需要注意以下几点:

  1. 线程池大小的选择:线程池的大小需要根据系统的负载和资源情况进行选择,太小会导致线程不足,任务无法及时处理,太大会导致资源浪费和负载过重。
  2. 线程池的关闭:在程序结束时需要正确地关闭线程池,释放资源,避免资源泄漏。
  3. 任务的提交方式:任务的提交可以采用不同的方式,如同步提交、异步提交等,需要根据实际需要进行选择。
  4. 错误处理机制:线程池需要有相应的错误处理机制,处理任务执行过程中的异常情况。

    

相关文章:

多线程-线程池

为什么要使用线程池 在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数据库的高可用&#xff0c;KeepalivedMysql双主来实现MYSQL-HA&#xff0c;两台Mysql数据库的数据保持完全一致&#xff0c;实现方法是两台Mysql互为主从关系&#xff0c;通过keepalived配置VIP&#xff0c;实现当其中的一台Mysql数据库宕机…...

关于同一个地址用作两个不同页面时,列表操作栏按钮混淆状态

同一个地址用作两个不同页面时&#xff0c;列表页的操作栏中有好多个按钮&#xff0c;如果用了v-if&#xff0c;可能会导致按钮混淆状态如disabled等属性混乱 解决方法1&#xff1a; 将v-if换成v-show&#xff0c;用了v-show之后意味着所有按钮都在只是在页面上隐藏了 解决方…...

Oracle段延迟分配(Deferred Segment Creation)解析

目录 一、基本概念二、工作原理三、优势四、潜在风险与注意事项五、配置与管理 Oracle段延迟分配&#xff08;Deferred Segment Creation&#xff09;是Oracle 11g引入的一项重要特性&#xff0c;旨在优化资源使用和提高数据库管理效率。 一、基本概念 段延迟分配意味着当创建…...

Linux:IPC - System V

Linux&#xff1a;IPC - System V 共享内存 shm创建共享内存shmgetshmctlftok 挂接共享内存shmatshmdt shm特性 消息队列 msgmsggetmsgctlmsgsndmsgrcv 信号量 semSystem V 管理机制 System V IPC 是Linux系统中一种重要的进程间通信机制&#xff0c;它主要包括共享内存 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 …...

嵌入式进阶——矩阵键盘

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 矩阵按键原理图按键状态检测单行按键状态检测多行按键状态检测 状态记录状态优化循环优化 矩阵按键 矩阵键盘是一种常见的数字输入…...

请说出vue.cli项目中src目录每个文件夹和文件的用法

在Vue CLI项目中&#xff0c;src目录是存放项目源码及需要引用的资源文件的主要位置。以下是src目录下常见文件夹和文件的用法&#xff1a; components 用途&#xff1a;存放可重用的Vue组件。这些组件通常用于在多个页面或布局中共享UI和功能。特点&#xff1a;组件应该是模块…...

【MySQL精通之路】InnoDB磁盘I/O和文件空间管理(11)

主博客&#xff1a; 【MySQL精通之路】InnoDB存储引擎-CSDN博客 目录 1.InnoDB磁盘I/O 1.1 预读 1.2 双写缓冲区 2.文件空间管理 2.1 Pages, Extents, Segments, and Tablespaces&#xff08;很重要&#xff09; 2.2 配置保留文件段页面的百分比 2.3 页与表行的关系 …...

基于springboot+html的二手交易平台(附源码)

基于springboothtml的二手交易平台 介绍部分界面截图如下联系我 介绍 本系统是基于springboothtml的二手交易平台&#xff0c;数据库为mysql&#xff0c;可用于毕设或学习&#xff0c;附数据库 部分界面截图如下 联系我 VX&#xff1a;Zzllh_...

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-24.3,4 SPI驱动实验-I.MX6U SPI 寄存器

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…...

【Pandas】数据处理方法

1.数据拆分 pandas.Series.str.extract() Series.str.extract(pat, flags0, expandTrue)[source]extract(提取) 参数 pat: 带分组的正则表达式。 flag: re模块中的标志&#xff0c;例如re.IGNORECASE&#xff0c;修改正则表达式匹配的大小写、空格等 expand: 默认为True&…...

【ArcGIS For JS】前端geojson渲染行政区划图层并加标签

原理 通过DataV工具 生成行政区的geojson&#xff08;得到各区的面元素数据&#xff09;, 随后使用手动绘制featureLayer与Label&#xff0c;并加载到地图。 //vue3加载geojson数据public/geojson/pt.json,在MapView渲染上加载geojson数据 type是"MultiPolygon"fetc…...

Spring AOP原理详解:动态代理与实际应用

1. Spring AOP概述 1.1 什么是AOP AOP&#xff08;Aspect-Oriented Programming&#xff0c;面向切面编程&#xff09;是一种编程范式&#xff0c;旨在将横切关注点&#xff08;Cross-Cutting Concerns&#xff09;从业务逻辑中分离出来。横切关注点是指那些分散在应用程序多…...

死锁的四个必要条件

死锁的四个必要条件如下&#xff1a; 互斥条件&#xff08;Mutual Exclusion&#xff09;&#xff1a;资源是独占的&#xff0c;即在同一时间内一个资源只能被一个进程或线程所使用&#xff0c;其他进程或线程无法访问该资源。 请求与保持条件&#xff08;Hold and Wait&#…...

源网络地址转换SNAT

左上角的是访问互联网发送的数据包&#xff0c;第一个是访问&#xff0c;第二个是网页传回来的 3、4项是源端口号和目的端口号&#xff08;3是随机的&#xff08;1024-65535&#xff09;&#xff0c;那个是http的网页服务端口就是80&#xff09; 那么往回传数据的时候源和目的…...

【算法】平衡二叉搜索树的左旋和右旋

树旋转是一种维护平衡树结构的重要操作&#xff0c;主要用于平衡二叉搜索树&#xff08;如AVL树和红黑树&#xff09;。树旋转分为左旋和右旋。 1. 树旋转的定义 左旋 (Left Rotation) 左旋操作将节点及其右子树进行调整&#xff0c;使其右子树的左子节点成为根节点&#xf…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...

TJCTF 2025

还以为是天津的。这个比较容易&#xff0c;虽然绕了点弯&#xff0c;可还是把CP AK了&#xff0c;不过我会的别人也会&#xff0c;还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决

问题&#xff1a; pgsql数据库通过备份数据库文件进行还原时&#xff0c;如果表中有自增序列&#xff0c;还原后可能会出现重复的序列&#xff0c;此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”&#xff0c;…...

STM32标准库-ADC数模转换器

文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”&#xff1a;输入模块&#xff08;GPIO、温度、V_REFINT&#xff09;1.4.2 信号 “调度站”&#xff1a;多路开关1.4.3 信号 “加工厂”&#xff1a;ADC 转换器&#xff08;规则组 注入…...

ubuntu中安装conda的后遗症

缘由: 在编译rk3588的sdk时&#xff0c;遇到编译buildroot失败&#xff0c;提示如下&#xff1a; 提示缺失expect&#xff0c;但是实测相关工具是在的&#xff0c;如下显示&#xff1a; 然后查找借助各个ai工具&#xff0c;重新安装相关的工具&#xff0c;依然无解。 解决&am…...