Java多线程 处理子线程异常的两种策略.(UncaughtExceptionHandler的介绍)
发布日期:2021-06-30 13:12:03
浏览次数:2
分类:技术文章
本文共 1481 字,大约阅读时间需要 4 分钟。
文章目录
方法一: 手动在每个run方法中进行try catch
如下的代码示例中, 就是在子线程中, 进行异常的捕获
package com.thread.uncaughtexception;public class CantCatchDirectly implements Runnable{ public static void main(String[] args) throws InterruptedException { //try { new Thread(new CantCatchDirectly(),"MyThread-1").start(); Thread.sleep(300); new Thread(new CantCatchDirectly(),"MyThread-2").start(); Thread.sleep(300); new Thread(new CantCatchDirectly(),"MyThread-3").start(); Thread.sleep(300); new Thread(new CantCatchDirectly(),"MyThread-4").start(); //} catch (RuntimeException e) { // e.printStackTrace(); //} } @Override public void run() { try { throw new RuntimeException(); } catch (RuntimeException e) { // e.printStackTrace(); System.out.println(" 捕获了异常 "); } }}
打印如下
这样做的弊端就是在每一个run方法中, 都要去捕获异常, 并且还要判断其异常的类型, 这样做效率太低.方法二: 使用UncaughtExceptionHandler
通过如下的源码可以看到UncaughtExceptionHandler接口为Thread类的内部接口, 并且只有一个方法.返回值为void .
参数为两个, 一个是线程 ,一个是异常. 代表是哪个线程 ,抛了哪个异常信息.Java异常处理器的调用策略
异常处理器的源码如下:
主要的逻辑是: 首先检查是否有父线程, 如果有的话, 就用父线程的方法. 就是下面源码的parent.uncaughtException(t,e)
这个方法其实是本身, 就是递归调用. 会一直找到最顶层的ThreadGroup的异常处理器. 如果找到顶层的过程中,还是没有线程去处理, 那么就会进入到else的部分.
在else的部分, 会调用Thread.getDefaultUncaughtExceptionHandler. 如果没有实现UncaughtExceptionHandler这个接口, 那么获取的就是null ,则直接输出异常堆栈信息. 如果获取的不为空, 那么就会根据用户写的代码的实现, 去进行异常的处理 .转载地址:https://javaweixin6.blog.csdn.net/article/details/108309844 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2024年05月04日 17时37分08秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
CodeForces - 675A Infinite Sequence(简单数论 细节)
2019-04-30
CodeForces - 1042B Vitamins (思维)
2019-04-30
ACM 2013 长沙区域赛 Collision (几何)
2019-04-30
ACM 2014 鞍山区域赛 E - Hatsune Miku (dp)
2019-04-30
反向传播&梯度下降 的直观理解程序(numpy)
2019-04-30
CodeForces - 931B World Cup (思维 模拟)
2019-04-30
ACM 2017 北京区域赛 J-Pangu and Stones(区间dp)
2019-04-30
java常用类 String面试题
2019-04-30
Windows10下的powershell美化教程
2019-04-30
利用ffmpeg合并音频和视频
2019-04-30
solr修改schema文件(solr修改配置文件)
2019-04-30
select下拉框分组展示插件的使用--(select-mania插件的使用)
2019-04-30
Java Lambda表达式的应用--Stream API操作集合框架
2019-04-30
Myslq连接(JDBC)url属性的参数的设置
2019-04-30
关于Spring MVC与前端的交互
2019-04-30
大厂经典面试题:Redis为什么这么快?
2019-04-30