Java多线程中异常的处理UncaughtExceptionHandler

Java UncaughtExceptionHandler异常处理实践 在Java多线程编程中,线程有可能遇到未捕获的异常。这种异常如果没有被捕获处理,那么默认情况下会导致线程终止,而程序的其他部分可能对此毫不知情。接口允许我们对这些未捕获的异常进行处理,使得程序能够在异常发生后继续运行或者优雅地关闭。接口的作用主要体现在以下几个方面:提供了异常信息的集中处理机制,可以对未捕获异常统一做日志记录、清理资源、发送警报等。有助于提高程序的健壮性,允许程序对突发事件做出响应,而不是直接崩溃。 阅读详情


本文转自:http://peirenlei.iteye.com/blog/305079

Thread的run方法是不抛出任何检查型异常(checked exception)的,但是它自身却可能因为一个异常而被终止,导致这个线程的终结。最麻烦的是,在线程中抛出的异常即使使用try...catch也无法截获,因此可能导致一些问题出现,比如异常的时候无法回收一些系统资源,或者没有关闭当前的连接等等。

JDK5.0之前,不能为单独的Thread设置UncaughtExceptionHandler,也不能指定一个默认的UncaughtExceptionHandler。为了可以设置一个UncaughtExceptionHandler,需要去继承ThreadGroup并覆写uncaughtException方法。

在JDK5.0中,我们通过Thread的实例方法setUncaughtExceptionHandler,可以为任何一个Thread设置一个UncaughtExceptionHandler。当然你也可以为所有Thread设置一个默认的UncaughtExceptionHandler,通过调用Thread.setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)方法,这是Thread的一个static方法。

定义一个Handler类必须实现Thread.UncaughtExceptionHandler接口的void uncaughtException(Thread t, Throwable e)方法。如果不设置一个Handler,那么单个Thread的Handler是null。但是,如果这个单个线程是ThreadGroup中的一个Thread,那么这个线程将使用ThreadGroup的UncaughtExceptionHandler。ThreadGroup自身已经实现了Thread.UncaughtExceptionHandler接口。 

這樣就夠了 


uncaughtException(Thread a, Throwable e)可以拿到Thread,所以在uncaughtException释放相关资源是最好的办法。

总之,JDK5.0中Thread及其相关的辅助功能得到了加强,为我们提供了很多便利和安全的解决方案:) 


import  java.lang.Thread.UncaughtExceptionHandler;
 
public   class  ThreadTest {
 
  
public   static   void  main(String[] args) {
    ErrHandler handle 
=   null ;
    ThreadA a 
=   null ;
 
    a 
=   new  ThreadA();
    handle 
=   new  ErrHandler();
    a.setUncaughtExceptionHandler(handle);
//  加入定义的ErrHandler
    a.start();
 
  }
 
}
 
/**
 * 自定义的一个UncaughtExceptionHandler
 
*/
class  ErrHandler  implements  UncaughtExceptionHandler {
  
/**
   * 这里可以做任何针对异常的处理,比如记录日志等等
   
*/
  
public   void  uncaughtException(Thread a, Throwable e) {
    System.out.println(
" This is: "   +  a.getName()  +   " ,Message: "
        
+  e.getMessage());
    e.printStackTrace();
  }
}
 
/**
 * 拥有UncaughtExceptionHandler的线程
 
*/
class  ThreadA  extends  Thread {
 
  
public  ThreadA() {
 
  }
 
  
public   void  run() {
 
    
double  i  =   12   /   0 ; //  抛出异常的地方
  }
 
}

数字IC后端设计实现之Innovus POD V2 Flow性能优化全解析 本文深入解析了数字IC后端设计中的Innovus POD V2 Flow性能优化方案。该流程通过整合place_opt_design与clock_opt_design命令,实现了布局与时钟树的协同优化,有效提升了时序收敛效率、改善了设计密度与拥塞,并显著减少了迭代次数,是应对先进工艺复杂设计的关键利器。 阅读详情

相关推荐

CST周期边界仿真:揭秘频率选择表面(FSS)单元设计全流程

本文详细解析了CST周期边界仿真在频率选择表面(FSS)单元设计中的应用全流程。从理论基础到工程实践,涵盖了求解器选择、几何建模、边界设置、端口优化等关键步骤,并提供了常见问题排查指南。通过CST仿真技术,工程师能够高效预测FSS的电磁特性,为实际应用提供可靠的设计依据。

weixin_30571465的博客 357

低场MRI的EMI抑制:FENCE技术原理与应用

电磁干扰(EMI)是影响医疗影像设备性能的关键因素之一,尤其在低场MRI系统中更为突出。EMI主要通过电容耦合途径传导,导致图像伪影和信噪比下降。传统解决方案如法拉第屏蔽室成本高昂且限制设备移动性。FENCE技术通过内置柔性PCB屏蔽层和特殊轴向狭缝结构,有效阻断电容耦合通路,同时保留磁感应信号传输。该技术不仅显著提升图像质量,还大幅降低成本,使低场MRI在急救、基层医疗等场景中更具实用性。FENCE技术的核心在于平衡屏蔽效能与系统性能,为医疗影像设备的EMI抑制提供了创新解决方案。

weixin_34050519的博客 688

MatterPort3D 数据集下载

【代码】MatterPort3D 数据集下载。

qq_44106838的博客 6778

如何防止线程意外中止

Thread的run方法是不抛出任何检查型异常(checked exception)的,但是它自身却可能因为一个异常而被终止,导致这个线程的终结。最麻烦的是,在线程中抛出的异常即使使用try...catch也无法截获,因此可能导致一些问题出现,比如异常的时候无法回收一些系统资源,或者没有关闭当前的连接等等。 JDK5.0之前,不能为单独的Thread设置UncaughtExceptionHandl

723

实战:GMTSAR软件处理陆探一号SAR数据

摘要:陆探一号(LT-1)是我国首组L波段差分干涉SAR卫星星座,具备全天候多极化成像能力,主要服务于自然资源监测等领域。文章详细介绍了其轨道参数(607km太阳同步轨道)和传感器技术指标(5种成像模式)。同时阐述了开源InSAR处理软件GMTSAR的安装方法(基于Ubuntu系统)及实验流程,包括数据准备、DEM生成和干涉处理步骤,特别说明了轨道数据缺失时的MATLAB插值处理方法。该研究为国产SAR卫星数据处理提供了技术参考。

一个RSer的博客 1032

20231126-超详细Isaac Gym安装教程(基于双系统版本)

我一开始使用了WSL2虚拟环境试了集群服务器里面的交互式桌面,但是都失败了,WSL2因为没办法调用系统的GPU,应该有办法配置但我放弃了,感兴趣的可以自己探索(图片贴出来了)。服务器上出现的问题是Segmentation fault (core dumped),目前还没解决,有可能是驱动和cuda版本的问题(后面有时间再解决)等上图右边都达到了100%,就创建了一个名为rlgpu的conda环境,然后会出现success。注意安装版本要低于3.9!参考链接:非常详细,大家直接看这个博主的安装就行。

m0_37802038的博客 2万+

java 线程异常后结束线程池_【开发小记】 Java 线程池 之 被“吃掉”的线程异常(附源码分析和解决方法)...

前言今天遇到了一个bug,现象是,一个任务放入线程池中,似乎“没有被执行”,日志也没有打。经过本地代码调试之后,发现在任务逻辑的前半段,抛出了NPE,但是代码外层没有try-catch,导致这个异常被吃掉。这个问题解决起来是很简单的,外层加个try-catch就好了,但是这个异常如果没有被catch,线程池内部逻辑是怎么处理这个异常的呢?这个异常最后会跑到哪里呢?带着疑问和好奇心,我研究了一下线程...

weixin_39740283的博客 476

最新Python爬虫实战(入门爬虫篇)——案例8:图书网畅销榜数据采集(详细爬虫思路截图+抓包动图演示+完整爬虫代码+详细注释)

本次案例通过 Python 爬虫技术,成功实现了对图书网畅销榜多页数据的批量爬取与 Excel 保存。代码采用模块化设计,包含分页参数构造、API 接口请求、JSON 数据解析、Excel 数据持久化等完整流程;通过配置模拟浏览器的请求头,有效规避基础反爬策略,保证请求的稳定性。整个爬虫逻辑遵循 “分页遍历 → 接口请求 → JSON 解析 → 提取图书信息 → 保存到 Excel” 的标准流程,与电商类接口爬取范式高度一致。

努力让自己发光,对的人才能迎着光而来 29万+

JAVA多线程之UncaughtExceptionHandler——处理非正常的线程中止

当单线程的程序发生一个未捕获的异常时我们可以采用try....catch进行异常的捕获,但是在多线程环境中,线程抛出的异常是不能用try....catch捕获的,这样就有可能导致一些问题的出现,比如异常的时候无法回收一些系统资源,或者没有关闭当前的连接等等。 首先来看一个示例: package com.exception; public class...

weixin_33698823的博客 1087

YOLOv8极速瘦身实战:LAMP剪枝让模型又快又准

一个庞大的模型虽然强大,但在实际部署,尤其是资源受限的边缘设备(如无人机、移动电话、嵌入式系统)上,却面临着严峻的挑战:高昂的内存占用、巨大的计算量以及随之而来的高延迟和高能耗。本教程从LAMP剪枝的深刻理论出发,详细解释了它如何通过最小化最坏情况下的L2失真,并借助巧妙的数学简化,最终推导出一种高效、无超参数、层自适应的剪枝策略。它如同为臃肿的模型进行一次精准的“瘦身手术”,通过移除网络中冗余或不重要的权重、神经元甚至整个结构,来显著降低模型的参数量和计算量(FLOPs),从而实现推理加速和资源节约。

FJN110的博客 258

深度学习实战102-基于深度学习的网络入侵检测系统,利用各种AI模型和pytorch框架实现网络入侵检测

在明确了研究背景后,我们需要设定明确的项目目标。本项目的核心目标是开发一个高精度、低延迟的网络入侵检测系统检测准确率:达到95%以上,确保系统能够有效识别各类已知和未知的入侵行为。响应时间:控制在毫秒级范围内,以实现实时监测和快速响应。模型鲁棒性:在面对不同类型的网络环境和攻击手法时,系统需保持稳定的性能输出。可扩展性:系统设计需考虑未来可能面临的新型威胁,便于后续升级和维护。

微学AI的博客 1790

java线程异常终止_Java线程异常结束怎么解决

Java中线程异常结束的解决方法是:首先捕获线程执行过程中所产生的异常;然后当线程异常时,会通过调用setUncaughtExceptionHandler方法来捕获异常;最后再解决即可。【推荐教程:Java教程】我们开发工程中经常使用到线程,在线程使用上,我们可能会有这样的场景:(1)伴随这一个业务产生一个比较耗时的任务,而这个业务返回并不需要等待该任务。那我们往往会启动一个线程去完成这个异步任务...

weixin_34220502的博客 2505

华为OD机试双机位C卷:字符串计数匹配 (C/C++/Py/Java/Js/Go)

华为OD机试双机位C卷 字符串计数匹配,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。 华为OD机试 字符串计数匹配, 华为OD上机考试 - 字符串计数匹配。

qq_45776114的博客 1647

java多线程中unchecked 异常的处理UncaughtExceptionHandler

Thread的run方法是不抛出任何检查型异常(checked exception)的,但是它自身却可能因为一个异常而被终止,导致这个线程的终结。最麻烦的是,在线程中抛出的异常即使在主线程中使用try...catch也无法截获,因此可能导致一些问题出现,比如异常的时候无法回收一些系统资源,或者没有关闭当前的连接等等。  主线程之所以不处理子线程抛出的RuntimeException,是因

朝着梦想 渐行前进 3002

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

0018 Java多线程中UncheckedException异常处理UncaughtExceptionHandler【基础】

Java线程池异常处理 待写。。。

junlinbo的专栏 956

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

java多线程-异常处理【UncaughtExceptionHandler】

线程未捕获异常 UncaughtException 需要UncaughtZExceptionHandler 来进行处理那么为什么非要用UncaughtZExceptionHandler呢?在run方法中进行try catch可以捕获到异常,但是特别麻烦,因为需要手动地在每个run方法中都进行try catch。

jx的博客 673

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java 之 UncaughtExceptionHandler异常处理机制

1.java 1.5版本出现的UncaughtExceptionHandler 当线程由于未捕获异常突然终止时调用的处理程序的接口。 当一个线程由于未捕获异常即将终止时,Java虚拟机将使用thread . getuncaughtexceptionhandler()查询线程的uncaughtException处理程序,并调用处理程序的uncaughtException方法,将线程和异常...

小灰~的博客 1万+

Java多线程 处理子线程异常的两种策略.(UncaughtExceptionHandler的介绍)

文章目录方法一: 手动在每个run方法中进行try catch方法二: 使用UncaughtExceptionHandlerJava异常处理器的调用策略 方法一: 手动在每个run方法中进行try catch 如下的代码示例中, 就是在子线程中, 进行异常的捕获 package com.thread.uncaughtexception; public class CantCatchDirectly implements Runnable{ public static void main(Str

Java持续实践 932

Java多线程--全局异常处理--方法/实例

原文网址: 简介 说明 本文用示例介绍如何处理Java多线程中的异常。 在Java中,线程中的异常是不能抛出到调用该线程的外部方法中捕获的。 为什么不能抛出异常到外部线程捕获? 因为线程是独立执行的代码片断,线程的问题应该由线程自己来解决,而不要委托到外部。基于这样的设计理念,在Java中,线程方法的异常都应该在线程代码边界之内(run方法内)进行try catch并处理掉。换句话说,我们不能捕获从线程中逃逸的异常。 JDK如何控制线程异常不会跑...

IT利刃出鞘的博客 1723

UncaughtExceptionHandler—处理Runnable线程内的非受检异常

Java的异常非为受检异常和非受检异常。由于在多线程中,run()方法无法继续向上显式抛出异常。所以这就使得Thread线程中的异常处理变得棘手。 首先对于受检异常,其应对办法非常通用:就是直接在run()方法体中捕获异常,然后进行对应的处理。 对于非受检异常,JVM会帮助我们捕获到。那么我们如何处理JVM捕获的异常呢?答案是Thread.UncaughtExceptionHandler类。正如JDK文档所介绍的一样: “当一个线程由于发生了非受检异常而终止时,JVM会使用Thread.gerUncaugh

义臻的博客 5457

java多线程中出现的异常_Java多线程25:线程中出现异常的处理

实例代码以下:javapackage unit7;public class Demo11_Run {public static void main(String[] args) {Demo11_MyThread t = new Demo11_MyThread();t.start();}}class Demo11_MyThread extends Thread {public void run() ...

weixin_31842715的博客 439

Java多线程:捕获线程异常

你处理过多线程中的异常吗?如何捕获多线程中发生的异常?捕获子线程的异常与捕获当前线程的异常一样简单吗?除了try catch。Java中还可以通过异常处理器UncaughtExceptionHandler来处理那些未捕获的异常。# 可以在当前通过try catch的方式捕获其他线程抛出的异常吗?'

Java_zhujia的博客 3306

【java并发编程】多线程异常处理

1.场景 ​ 多线程充分发挥了系统的性能,但是调用Thread.start()方法之后,如果线程有异常造成线程终止,主线程无法及时获取。 public static void main(String[] args) { Thread thread = new Thread(() -> { //todo 添加要执行内容 for...

叁滴水 的博客 1769

Java多线程异常处理

Java多线程异常捕获

ybobob_的博客 1145
下一篇: Java泛型方法
FromMeToMyself
博客等级 码龄11年 0粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值