一次线上多线程程序问题排查

简介:

问题描述:

周一发现线上的一个程序从上周日一直运行“卡住”了十多个小时,本来是10MIN一次更新数据的,导致现在数据一直停留在过去,并且由于程序一直“卡住”不报错,使得我们收不到报警短信通知。


问题分析与定位:


根据报错日志来看,是一个类A的static区域发生了异常,由于在static区域并没有catch住这个异常,导致类A无法加载成功,JAVA异常打印如下:

java.lang.NoClassDefFoundError: Could not initialize class

可是,为什么程序会“卡住”呢?



接下来,分析了下,程序的运行结构,发现:

程序会开启N个线程去并发请求数据,然后利用JOIN的方式,合并线程,待所有线程都请求完后,再去执行其他步骤。在线程任务类中的run方法利用到了那个类A!更加重要的是,在对类A方法调用也没有任何异常的处理!

也就是说这N个线程运行run方法,就会抛出异常,线程就会终结!

线程已经死掉了,可是JOIN还在等待着线程进行合并,一直等待着他们活过来!

这就是程序为什么一直卡住的根本原因!



可见,我们在对待线程的异常处理上,应该小心,如果我们不处理,那么这个线程可能死掉,我们还不知道!那么处理线程异常的方式有哪些呢?


线程内解决:

线程是一段独立的代码,有问题,应该让它自己来CATCH住处理,即应该注意在run方法中处理异常。


线程外解决:

Thread方法提供了一个方法:setUncaughtExceptionHandler

可以通过这个方法来实现线程代码之外处理未捕获异常!


本文转自zfz_linux_boy 51CTO博客,原文链接:http://blog.51cto.com/zhangfengzhe/1704416,如需转载请自行联系原作者

相关文章
|
7月前
|
Kubernetes Linux Go
使用 Uber automaxprocs 正确设置 Go 程序线程数
`automaxprocs` 包就是专门用来解决此问题的,并且用法非常简单,只需要使用匿名导入的方式 `import _ "go.uber.org/automaxprocs"` 一行代码即可搞定。
320 78
|
Java 开发者
如何通过易语言多线程提升程序响应速度
如何通过易语言多线程提升程序响应速度
600 62
|
分布式计算 并行计算 安全
在Python Web开发中,Python的全局解释器锁(Global Interpreter Lock,简称GIL)是一个核心概念,它直接影响了Python程序在多线程环境下的执行效率和性能表现
【6月更文挑战第30天】Python的GIL是CPython中的全局锁,限制了多线程并行执行,尤其是在多核CPU上。GIL确保同一时间仅有一个线程执行Python字节码,导致CPU密集型任务时多线程无法充分利用多核,反而可能因上下文切换降低性能。然而,I/O密集型任务仍能受益于线程交替执行。为利用多核,开发者常选择多进程、异步IO或使用不受GIL限制的Python实现。在Web开发中,理解GIL对于优化并发性能至关重要。
229 0
|
安全 Java
线程安全的艺术:确保并发程序的正确性
在多线程环境中,确保线程安全是编程中的一个核心挑战。线程安全问题可能导致数据不一致、程序崩溃甚至安全漏洞。本文将分享如何确保线程安全,探讨不同的技术策略和最佳实践。
197 6
|
Java 开发者
如何通过易语言多线程提升程序响应速度?
如何通过易语言多线程提升程序响应速度?
|
监控 Java API
|
Rust 并行计算 安全
揭秘Rust并发奇技!线程与消息传递背后的秘密,让程序性能飙升的终极奥义!
【8月更文挑战第31天】Rust 以其安全性和高性能著称,其并发模型在现代软件开发中至关重要。通过 `std::thread` 模块,Rust 支持高效的线程管理和数据共享,同时确保内存和线程安全。本文探讨 Rust 的线程与消息传递机制,并通过示例代码展示其应用。例如,使用 `Mutex` 实现线程同步,通过通道(channel)实现线程间安全通信。Rust 的并发模型结合了线程和消息传递的优势,确保了高效且安全的并行执行,适用于高性能和高并发场景。
408 0
|
调度
【浅入浅出】Qt多线程机制解析:提升程序响应性与并发处理能力
在学习QT线程的时候我们首先要知道的是QT的主线程,也叫GUI线程,意如其名,也就是我们程序的最主要的一个线程,主要负责初始化界面并监听事件循环,并根据事件处理做出界面上的反馈。但是当我们只限于在一个主线程上书写逻辑时碰到了需要一直等待的事件该怎么办?它的加载必定会带着主界面的卡顿,这时候我们就要去使用多线程。
454 6
|
开发框架 Android开发 iOS开发
跨平台开发的双重奏:Xamarin在不同规模项目中的实战表现与成功故事解析
【8月更文挑战第31天】在移动应用开发领域,选择合适的开发框架至关重要。Xamarin作为一款基于.NET的跨平台解决方案,凭借其独特的代码共享和快速迭代能力,赢得了广泛青睐。本文通过两个案例对比展示Xamarin的优势:一是初创公司利用Xamarin.Forms快速开发出适用于Android和iOS的应用;二是大型企业借助Xamarin实现高性能的原生应用体验及稳定的后端支持。无论是资源有限的小型企业还是需求复杂的大公司,Xamarin均能提供高效灵活的解决方案,彰显其在跨平台开发领域的强大实力。
218 0

热门文章

最新文章