Java并发必杀技!线程池让你的程序速度飙升不止一点点!

news2024/9/24 21:28:15

在这里插入图片描述

文章目录

    • 1 线程池的工作机制是什么?
    • 2 线程池的任务出现异常该怎么解决?
    • 3 线程池的内存泄露该如何解决?

近期迷上了举例子来结合知识点学习,尽量减少枯燥,如有错见谅哈~

1 线程池的工作机制是什么?

线程池的工作机制是管理和重用线程,以提高多任务处理的效率和性能。

想象一下,线程池就像是一支备战的队伍,提前准备了一些士兵(线程),他们随时待命。

当有任务(任务是需要完成的工作)到达时,如果有空闲的士兵,任务就会分配给他们去执行。

如果所有的士兵都在忙,任务就会暂时排队等待,直到有士兵空闲下来为止。执行完任务后,士兵不会立刻解散,而是等待下一个任务的到来继续服务,这样可以节省时间和精力。

创建线程池初期,会预先准备一些线程,这些线程待命着,准备接受任务。

任务到达线程池时,线程池会检查当前活跃的线程数和任务队列的状态。

如果有空闲线程,线程池会将任务分配给其中一个空闲线程执行。

如果所有线程都在忙碌中,任务会被暂时存储在一个任务队列中,等待有空闲线程时再取出执行。

执行任务的过程中,线程池会处理线程的创建、重用和管理。

任务执行完毕后,线程不会被立即销毁,而是保留在池中,以备下次任务到来时重复利用。

这种重复利用减少了线程创建和销毁的开销,提升了系统的响应速度和资源利用率。

额外扩展:线程池还能根据配置自动调整线程数量,比如固定大小线程池有固定数量的线程,而缓存线程池则根据需要动态调整线程数量。

2 线程池的任务出现异常该怎么解决?

当线程池中的任务出现异常时,通常需要采取一些措施来处理和避免影响整个系统的稳定性和运行。

想象一下,线程池中的士兵(线程)执行任务时,如果遇到了问题,比如任务出现了异常,就像是士兵在执行任务时遭遇了意外。

线程池会立即捕捉到这个异常情况,然后会有一名指挥官(异常处理器)负责接收并处理这个异常信息。

指挥官可能会通知其他队员(开发人员),并采取相应的措施,比如记录战报(写入日志)、调集救援队(发送警报)等,以便及时修复任务中的问题,并确保队伍继续高效运行。

线程池会捕获任务执行过程中抛出的异常。

方法一:

如果设置了异常处理器(ExceptionHandler),它会接收到异常信息,并可以进行特定的处理,比如记录日志、发送警报等操作,以便开发人员能够及时了解并调试问题。

方法二:

线程池会尝试终止出问题的线程,并将这个线程从池中移除,同时创建一个新的线程来取代它,确保整体运行不受影响。

代码Demo:

ExecutorService executor = Executors.newFixedThreadPool(5);

// 提交任务到线程池
executor.submit(() -> {
    try {
        // 执行任务代码
        // 可能会抛出异常的代码
    } catch (Exception e) {
        // 异常处理逻辑
        System.err.println("任务执行出现异常:" + e.getMessage());
        // 记录日志或发送警报等
    }
});

// 关闭线程池
executor.shutdown();

3 线程池的内存泄露该如何解决?

线程池就像是一个工厂,负责执行一系列的任务。内存泄露就好比是工厂里的某个地方出现了漏水,导致水无法被正确排出去。

在线程池中,如果任务执行过程中出现内存泄露 ,就意味着某些任务执行时使用的内存没有被及时释放,会导致系统资源的浪费和性能下降 。

原因:

任务中使用了大量的内存或者一些资源没有被及时清理。

解决方案:

方案一:

需要详细检查每个任务的代码,确保在任务执行完毕后释放掉所有的资源。比如,如果任务中使用了大对象或者打开了文件、数据库连接等资源,就要在任务执行完成后,显式地关闭这些资源,这样可以确保资源能够被及时释放,避免内存堆积问题。

方案二:

考虑调整线程池的配置,比如调整线程池的大小,避免创建过多的线程,以减少内存占用。合理配置线程池参数可以有效地控制资源的使用,提高系统的稳定性和性能。

代码Demo:

ExecutorService executor = Executors.newFixedThreadPool(10);

// 提交任务到线程池
executor.submit(() -> {
    try {
        // 执行任务代码,可能会引起内存泄露的操作
        // 比如创建大对象或者打开资源
    } finally {
        // 确保在任务执行结束后,释放资源
        // 比如关闭文件、数据库连接等
    }
});

// 关闭线程池
executor.shutdown();

确保在任务执行完毕后,无论是否发生异常,都会执行资源释放的操作,这有助于避免内存泄露问题的发生。

面对挫折,选择成长而非逃避,因为磨砺使人锋利

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2053424.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

登录方式(c语言)

1.//描述 //有个软件系统登录的用户名和密码为(用户名:admin,密码:admin),用户输入用户名和密码,判断是否登录成功。 //输入描述: //多组测试数据,每行有两个用空格分开的…

Java语言程序设计——篇十五(1)

🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳&…

K8s节点状态 NotReady排查

k8s节点由 Ready变成 NotReady izbp12ghzy6koox6fqt0suz NotReady slave 97d v1.23.3 izbp12ghzy6koox6fqt0svz Ready control-plane,master 98d v1.23.3节点进入 NotReady 状态可能是由于多种原因引起的,尤其是在资源过量分配&am…

CSS+JS实现一个鼠标移动的高亮边框效果

一、过程分析 先上效果: 在Windows系统里有一个很棒的细节效果,元素的渐变高亮边框是可以感知鼠标的,边框的高亮部分会跟随鼠标的移动而移动。 这种效果也是比较常见的,但是实现起来还是需要一点时间和思路的。 首先&#xff0…

花裤衩 vue 前后端登录

从官网复制地址, idea中打开打开后输入 npm i 编译下载修改配置 找到 vue.config.js打开后,找到第39行 删除代码, 把可粘贴粘上 可粘贴: proxy: { [process.env.VUE_APP_BASE_API]: { target: http://127.0.0.1:18080, changeOrigin: true, pathRewrite…

使用托管竞价实例在Amazon SageMaker上运行机器学习训练

这是本系列文章的第二篇,旨在通过动手实践,帮助大家学习亚马逊云科技的生成式AI相关技能。通过这些文章,大家将掌握如何利用亚马逊云科技的各类服务来应用AI技术。 那么让我们开始今天的内容吧! 介绍 什么是Amazon SageMaker …

ant design pro access.ts 是如何控制多角色的权限的

ant design pro 如何去保存颜色ant design pro v6 如何做好角色管理ant design 的 tree 如何作为角色中的权限选择之一ant design 的 tree 如何作为角色中的权限选择之二 看上面的图片,在前端中如何控制这些权限,比如控制按钮的显示,还有菜单…

Stable diffusion模型分几种?一文详解,入门必看!

在Stable Diffusion中,模型并不只有一种,不同插件有不同的模型,分别作用于不同的功能。今天就带大家一起来学习一下~ 01 大模型 也就是stable diffusion模型,在默认界面中,它位于web页面的左上角&#x…

[数据结构] RBTree 模拟实现RBTree

标题:[数据结构] RBTree && 模拟实现RBTree 水墨不写bug 目录 一、红黑树的概念 二、map和set的封装 三、红黑树的实现 1、红黑树节点的定义 2、红黑树的结构 3、红黑树的插入 1.名称 2.插入节点的颜色 红黑树的insert 实现 情况一:不…

微信自动化管理了解下

微信作为一款广泛使用的社交软件,已经成为人们日常生活中不可或缺的通讯工具。不仅个人用户频繁使用,许多企业也依赖微信进行业务沟通和客户服务。 然而,对于企业用户来说,管理多个微信账户往往带来诸多繁琐和不便之处。这些问题…

Django+anaconda

一、搭建django虚拟环境 打开anaconda prompt 输入:conda create -n mydjango_env 判断(y/n):y 查看虚拟环境 conda env list *号表示当前使用的环境 激活创建的虚拟环境 activate mydjango_env 二、安装Django 在新环境激活的状态下安装…

Nature|通过范德华层压实现三维单片集成系统 (半导体器件/集成电路)

2024年5月22日,湖南大学刘渊(Yuan Liu)教授课题组,在《Nature》上发布了一篇题为“Monolithic three-dimensional tier-by-tier integration via van der Waals lamination”的论文。第一作者为湖南大学物理与微电子科学学院陆冬林(Donglin Lu)博士。论文内容如下: 一、 …

Stable Diffusion 的采样器

一图 不推荐使用的采样器 PLMS LMS LMS Karras DPM fast DPM2 DPM2a DPM2 Karras DPM2 a Karras 可以在设置里把采样器去掉

同态加密和SEAL库的介绍(十)CKKS 参数心得 2

写在前面: 本篇继续上篇的测试,首先针对密文深度乘法情况,虽然密文乘法本就是应该尽量避免的(时间和内存成本过高),更不用说深度乘法了,但是为了测试的完整性,还是做一下方便大家比对…

CVE-2021-21315漏洞复现

一、基本信息 攻击机:kali IP:192.168.100.60 靶机:CentOS7 IP:192.168.100.40 二、攻击过程 下载node.js环境 wget https://nodejs.org/dist/v12.18.4/node-v12.18.4-linux-x64.tar.xz tar -xvf node-v12.18.4-linux-x64.tar.xz mv node-v12.18.4-…

89.WEB渗透测试-信息收集-Google语法(3)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:88.WEB渗透测试-信息收集-Google语法(2) 常用的 Google 语法的作用…

【大数据平台】可扩展性设计

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: 工💗重💗hao💗:野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

线程间同步的概念

一、线程间同步的概念 rtthread通过线程间同步建立线程间的执行顺序,多个线程访问的同一个内存叫做临界区。rtthread提供的同步的工具 1、信号量 2、互斥量 3、事件集 二、信号量 2.1 信号量概念 rtthread将信号量抽象成rt_semaphore. 2.2 信号量api 2.3 信号量示例…

本地Docker部署开源Web相册图库Piwigo与在线远程访问实战方案

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【leetcode详解】T3137(思路详解 代码优化感悟)

思路详解 要解决这个问题,我们的大致思路是这样:找到长度为k的字符串 (记为stringA) ,统计重复次数最多的那一个,则最终对应的k周期字符串就是 [stringA * n] 的形式( n word.length() / k) 要实现多对象的计数&…