如何解决多线程卡死问题?四招教你轻松应对!

news2024/9/28 7:16:28

多线程大家都用过,可以让一个程序同时执行多个任务,提高效率和性能,一个人干的慢,三个人干。但是,多线程也带来了一些问题和挑战,比如线程同步线程安全线程死锁等问题,三个人抢一碗米饭,没有个规矩肯定要打架的。

这里我介绍一种可能出现的多线程问题:如果一个线程在执行过程中一直卡住,线程不释放最终导致线程耗尽怎么办。

这是前一阶段对接外部系统时遇到的一个问题,对方提供了个SDK,我们集成后用他们的netty的方式建立连接,推送相关数据,但是呢这个推送不能阻塞业务,所以我们采用异步推送,搞了个线程池,随取随还,如图

 

后来就发现有一个现象,推着推着就不推了,卡到多线程前那里,也不进去,也不拒绝

然后我用executor.getTaskCount(), executor.getActiveCount(),executor.getCompletedTaskCount()打印日志发现活跃数没有了,并且拒绝策略是CallerRunsPolicy()(这个策略的意思:当任务添加到线程池中被拒绝时,会使用调用线程池的Thread线程对象处理被拒绝的任务,有个问题就是都没有线程对象了,自然也取不到来执行),所以看起来也不报错,像是假死,拒绝策略先不说,这里我们只处理线程耗尽的问题

我们升华一下对于这类问题我们要如何处理

问题分析

首先我们分析下为什么会出现这种情况。一个线程在执行过程中可能会遇到下面几种原因导致卡住:

  1. 线程等待某个资源或条件,但是资源或条件一直不满足,比如网络请求超时、锁竞争失败等。
  2. 线程遇到死循环或无限递归,导致程序逻辑无法继续执行。
  3. 线程遇到异常或错误,但是没有正确处理,导致程序崩溃或挂起。
  4. 如果一个线程卡住了,那么它就无法释放它占用的资源,比如内存、CPU、锁等等。这样就会影响其他线程的运行,甚至导致整个程序的性能下降或崩溃。如果我们不断地创建新的线程,而旧的线程不释放,最终就会导致线程耗尽。就会抛出OutOfMemoryError或UnableToCreateThreadException异常。

解决方案

针对上面的问题,我列了几种解决方案:

  1. 限制线程的数量。我们可以使用线程池来管理和复用线程,而不是每次都创建新的线程。这样可以避免创建过多的线程,也可以提高线程的利用率和管理性。
  2. 设置超时机制。我们可以给每个线程设置一个合理的超时时间,如果超过了这个时间,就认为该线程卡住了,并且强制中断或杀死该线程。这样可以避免某个线程无限等待或执行。
  3. 检查和优化代码逻辑。我们应该检查和测试我们的代码逻辑,避免出现死循环或无限递归等错误。如果发现有问题,我们应该及时修复和优化。
  4. 处理异常和错误。我们应该在每个线程中捕获并处理可能出现的异常和错误,并且在合适的时候释放资源和结束线程。这样可以避免程序崩溃或挂起。

不同的场景大家可以选用不同的方案,下面我针对第二种方案举个栗子,看看超时机制怎么设计,其他三种就不多说了

大家可以看到我们用了submit方法,得到一个Future,然后利用超时等待get方法来控制如果超时了TimeoutException,我们future.cancel(),这样就可以主动释放线程,不用一直阻塞了

// 创建一个线程池
ExecutorService executor = Executors.newSingleThreadExecutor();
// 提交一个任务
Future<String> future = executor.submit(new Callable<String>() {
    @Override
    public String call() throws Exception {
        // 这里是你要执行的代码,比如br.readLine()
        return br.readLine();
    }
});
// 设置一个超时时间,比如5秒
long timeout = 5;
// 尝试获取任务的结果,如果超时就抛出异常
try {
    String s = future.get(timeout, TimeUnit.SECONDS);
    // 如果没有超时,就正常处理结果
    System.out.println(s);
} catch (TimeoutException e) {
    // 如果超时,就取消任务,并且处理异常
    future.cancel(true);
    System.out.println("Time out has occurred");
}
// 关闭线程池
executor.shutdown();

 多线程是一种强大而复杂的编程技术,使用时要注意避免一些常见的问题和风险,后面会继续分享一些案例以及在在这期间用到的技术,找到每种技术合适的使用场景很重要

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

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

相关文章

操作系统OS(一)磁盘与文件系统

计算机存储 计算机只能看懂1和0组成的语言&#xff0c;所以计算机存储数据的大小就是存储了多少个1和0. 比特位bit&#xff08;位&#xff09; 是计算机世界中最小的存储单位&#xff0c;每个1或者0占据1bit&#xff0c;表示二进制位 字节byte 由8个二进制位构成&#xff0c;1…

OpenGL 几何着色器

1.效果展示 爆破物体。 2.简介 在顶点和片段着色器之间有一个可选的几何着色器&#xff0c;几何着色器的输入是一个图元&#xff08;如点或三角形&#xff09;的一组顶点。几何着色器可以在顶点发送到下一着色器阶段之前对它们随意变换。然而&#xff0c;几何着色器最有趣的…

RabbitMQ 2023面试5题(四)

一、RabbitMQ有哪些作用 RabbitMQ是一个消息队列中间件&#xff0c;它的作用是利用高效可靠的消息传递机制进行与平台无关的数据交流&#xff0c;并基于数据通信来进行的分布式系统的集成&#xff0c;主要作用有以下方面&#xff1a; 实现应用程序之间的异步和解耦&#xff1a…

[Africa battleCTF 2023 prequal] CPR部分

非州的比赛&#xff0c;说是总体简单&#xff0c;但也有几个难题0解&#xff0c;估计依然是等不到WP。 这个界面还挺好&#xff0c;除了慢以外没大问题。 Rev SEYI 题目很简单&#xff0c;程序报病毒&#xff0c;win11上的defender关上不容易呀。我的电脑怎么就不能听我的呢…

【Java高级语法】(十八)Optional类:解锁Java的Optional魔法:消灭那些隐匿的空指针,还程序世界一个安稳!~

Java高级语法详解之Optional类 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 常用操作API3.2 案例3.3 使用技巧 4️⃣ 应用场景5️⃣ 实现原理&#x1f33e; 总结 1️⃣ 概念 Optional类是Java 8引入的新特性&#xff0c;旨在解决空值&#xff08;null&#xff09;的处理问题。它…

ProtoBuf介绍与使用

文章目录 1、ProtoBuf概述2、下载和安装3、简单使用 1、ProtoBuf概述 Protobuf&#xff08;Protocol Buffers&#xff09;是由Google开发的一种语言无关的数据序列化格式。它旨在将结构化数据&#xff08;如结构化消息或文档&#xff09;高效地序列化为紧凑的二进制表示&#…

python GUI工具之PyQt5模块,pyCharm 配置PyQt5可视化窗口

https://doc.qt.io/qt-5/qtwidgets-module.html https://doc.qt.io/qt-5/qt.html#AlignmentFlag-enum 一、简介 PyQt是Qt框架的Python语言实现&#xff0c;由Riverbank Computing开发&#xff0c;是最强大的GUI库之一。PyQt提供了一个设计良好的窗口控件集合&#xff0c;每一…

【跑实验06】os包的理解?如何提取图片的名称?如何遍历一个文件夹,提取里面的图像名称?如何提取图片名称中的特定部分?代码错误地方修改;

文章目录 一、os包的理解1.1 文件和目录操作1.2 进程管理1.3 环境变量1.4 路径操作 二、如何提取图片的名称&#xff1f;三、遍历一个文件夹&#xff0c;提取里面的图像名称四、如何提取图片名称中的特定部分&#xff1f;五、代码报错修改 一、os包的理解 os 是 Python 中的一…

大厂OKR管理法:公开透明是最大特点

大厂OKR管理法&#xff1a;公开透明是最大的特点 仔细想&#xff0c;这是一件破天荒的事情 企业内部大部分的任务“公开透明” 公开透明会减少巨大的沟通成本 每个人的关键任务几乎是全部公开 估计少数的财务、人事、公关方面的不会 趣讲大白话&#xff1a;公开透明损耗少 【趣…

【UE 从零开始制作坦克】12-制作全自动机枪炮塔

效果 步骤 1. 下载模型和材质&#xff08;链接&#xff1a;https://download.csdn.net/download/ChaoChao66666/87951079&#xff09; 2. 将下载好的文件夹拖入UE工程中 首先点击“重置为默认”&#xff0c;然后勾选“合并网格体”&#xff0c;最后点击“导入所有” 导入后资源…

YOLOv5、YOLOv7独家原创改进:独家首发最新原创XIoU_NMS改进点,改进有效可以直接当做自己的原创改进点来写,提升网络模型性能、收敛速度和鲁棒性

💡该教程为属于《芒果书》📚系列,包含大量的原创首发改进方式, 所有文章都是全网首发原创改进内容🚀 💡本篇文章为YOLOv5、YOLOv7独家原创改进:独家首发最新原创XIoU_NMS改进点,改进有效可以直接当做自己的原创改进点来写,提升网络模型性能、收敛速度和鲁棒性。 �…

【Java】Java数组链表类详记

本文仅供学习参考&#xff01; 相关文章地址&#xff1a; https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html https://www.w3schools.com/java/java_arraylist.asp https://www.runoob.com/java/java-arraylist.html Java ArrayList 基础知识 ArrayList是 …

SpringSecurity-尚硅谷

前置知识 掌握Spring框架掌握SpringBoot使用掌握JavaWEB技术 文章目录 前置知识1. 简介1.1 概要1.2 历史 2.入门案例2.1 创建一个项目2.1.1 pom.xml2.1.2 controller层 2.2 运行这个项目2.32.4 SpringSecurity 基本原理2.5 UserDetailsService 接口讲解2.6 PasswordEncoder 接…

AI黑客松近期比赛清单;36氪AI淘宝店盈利复盘;GitHub Copilot官方最佳实践;AI在HR领域的应用探索 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; ⋙ 点击查看 AI Hackathon (黑客马拉松) 汇总清单 &#x1f916; 〖飞桨〗2023大模型应用创新挑战赛 百度飞桨联合上海市青年五十人创新创业研究院等…

【软件测试】推荐几款适合练手的项目

最近收到许多自学自动化测试的小伙伴私信&#xff0c;学习了理论知识后&#xff0c;却没有合适的练手项目。 测试本身是一个技术岗位&#xff0c;如果只知道理论&#xff0c;没有实战经验&#xff0c;在面试中很难说服面试官&#xff0c;比如什么场景下需要添加显示等待&#x…

CentOs7 安装jdk8详细教程

方法一&#xff1a;gz安装包安装&#xff08;推荐&#xff09; 1.下载所需版本的.tar.gz安装包 Oracle官网即可下载&#xff0c;选择好对应版本&#xff0c;可以先下到主机&#xff0c;然后上传到虚拟机的Linux上。&#xff08;注意&#xff1a;Oracle现在下载jdk需要注册登录…

OAuth2.0与单点登录的区别

本文说下OAuth2.0与单点登录的区别 文章目录 概述什么是单点登录单点登录和Oauth2.0的区别单点登录的实现本文小结 概述 SSO是Single Sign On的缩写&#xff0c;OAuth是Open Authority的缩写&#xff0c;这两者都是使用令牌的方式来代替用户密码访问应用。流程上来说他们非常相…

解决联网时自动打开浏览器转到必应msn网址的问题

现象 开机后或者断网重连之后&#xff0c;系统自动打开默认浏览器&#xff08;不管是IE还是谷歌&#xff0c;或其他的浏览器&#xff09;网址为http://go.microsoft.com/fwlink/?LinkID219472&clcid0x409接着转到http://cn.bing.com/ 或者 https://www.msn.com/ 解决方法…

Kafka系列 - kafka 副本|AR|ISR|OSR|Leader|Follower|HW|LEO

文章目录 01. kafka 副本信息02. kafka 中 ISR、AR和OSR代表什么&#xff1f;03. kafka 中 ISR的伸缩指什么&#xff1f;04. 什么情况下一个broker会从ISR中踢出去&#xff1f;05. kafka 副本和ISR扮演什么角色&#xff1f;06. kafka 副本长时间不在ISR中&#xff0c;意味着什么…

buuctf re(二)+ web CheckIn

目录 re xor helloword reverse3 web SUCTF 2019 CheckIn xor 1.查壳 64位&#xff0c;无壳 2.ida&#xff0c;f5查看伪代码 3.跟进global dq是八个字节&#xff0c;汇编数据类型参考汇编语言---基本数据类型_汇编db类型_wwb0111的博客-CSDN博客 4.因为global变量里有一…