关于子线程的异常捕获 - UncaughtExceptionHandler

2023-11-19

一、为什么需要Thread.UncaughtExceptionHandler

1.主线程可以轻松找到异常,但是子线程不行。

/**
 * 子线程异常问题
 *
 * @author xuehw
 * @date 2020-03-05
 */
public class ExceptionInChildThread implements Runnable {

    public static void main(String[] args) {
        new Thread(new ExceptionInChildThread()).start();
        for (int i = 0; i < 2000; i++) {
            System.out.println(i);
        }
    }

    @Override
    public void run() {
        throw new RuntimeException();
    }
}

在这里插入图片描述
运行过后我们发现似乎没有任何异常
在这里插入图片描述
但是往上查找,我们发现了异常堆栈信息,这样显然是不行的,子线程出错,不及时处理,会导致程序出现问题。

2.子线程无法用传统方式捕获。

/**
 * try..catch无法捕获
 *
 * @author xuehw
 * @date 2020-03-05
 */
public class CantCatchExp implements Runnable{
    public static void main(String[] args) throws InterruptedException {
        try {
            new Thread(new CantCatchExp(), "Thread-1").start();
            Thread.sleep(300);
            new Thread(new CantCatchExp(), "Thread-2").start();
            Thread.sleep(300);
            new Thread(new CantCatchExp(), "Thread-3").start();
            Thread.sleep(300);
            new Thread(new CantCatchExp(), "Thread-4").start();
        } catch (RuntimeException e) {
            System.out.println("GET EXCEPTION.11111");
        }

    }

    @Override
    public void run() {
            throw new RuntimeException();
    }
}

在这里插入图片描述
上面例子可以看出,在主线程中进行try…catch并没有捕获到子线程中抛出的异常,没有执行catch中的语句。

二、怎么使用Thread.UncaughtExceptionHandler

关于上面子线程异常主线程捕获问题,有两种解决方案。
第一种我们可以在子线程中手动进行try…catch,这种不是特别推荐。
另外一种就是利用Thread.UncaughtExceptionHandler。

1.源码分析

在这里插入图片描述
在这里插入图片描述
上面是UncaughtExceptionHandler及他调用的uncaughtException方法源码。

2.如何实现
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 * UncaughtExceptionHandler
 *
 * @author xuehw
 * @date 2020-03-05
 */
public class ThreadExceptionHandler implements Thread.UncaughtExceptionHandler {
    private String name;

    public ThreadExceptionHandler(String name) {
        this.name = name;
    }

    @Override
    public void uncaughtException(Thread t, Throwable e) {
        Logger logger = Logger.getAnonymousLogger();
        logger.log(Level.WARNING, "线程异常终止" + t.getName());
        System.out.println(name + "捕获了异常" + t.getName() + "异常");
    }
}
/**
 * 使用UncaughtExceptionHandler
 *
 * @author xuehw
 * @date 2020-03-05
 */
    public class UseExpHandler implements Runnable {

        public static void main(String[] args) throws InterruptedException {
            Thread.setDefaultUncaughtExceptionHandler(new ThreadExceptionHandler("异常捕获器-001"));

            new Thread(new UseExpHandler(), "Thread-1").start();
            Thread.sleep(200);
            new Thread(new UseExpHandler(), "Thread-2").start();
            Thread.sleep(200);
            new Thread(new UseExpHandler(), "Thread-3").start();
            Thread.sleep(200);
            new Thread(new UseExpHandler(), "Thread-4").start();
        }


        @Override
        public void run() {
            throw new RuntimeException();
        }
    }

运行结果:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于子线程的异常捕获 - UncaughtExceptionHandler 的相关文章

  • 经典SQL面试题讲解(11-20)

    本文转自公众号俊红的数据分析之路 本篇节选自书籍 对比Excel 轻松学习SQL数据分析 一书 主要讲解数据分析面试中常见的30道SQL面试题 1 10题见 几道经典SQL面试题讲解 11 行列互换 现在我们有下面这么一个表row col
  • POJ-1458最长公共子序列

    给定序列的子序列是给定序列 其中遗漏了一些元素 可能没有 给定序列X
  • CentOS 防火墙配置(firewall)

    常用的防火墙配置命令 查看所有防火墙规则 firewall cmd list all zones 查看当前区域防火墙规则 firewall cmd list all 添加一个开放服务规则 firewall cmd add service s
  • C++笔记九(STL:基础知识、string、vector、deque)

    1 STL基础 1 1为了建立数据结构与算法的一套标准 诞生了STL STL 标准模板库 广义分为 容器 算法 迭代器 容器与算法之间通过迭代器进行无缝连接 STL 所有代码基本上都采用了类模板和函数模板 1 2 STL六大组件 分别为 容
  • 山石岩读丨一文读懂区块链安全:区块链到底是什么?

    当2017年比特币在全球各种加密交易中达到19000美元的峰值时 加密数字货币就吸引了不仅限于技术爱好者和挖矿者 交易者的全世界范围的广泛关注 随后 使比特币成为可能的区块链技术也作为新兴主流技术之一进入了人们的视野 从产品营销人员到网络专
  • jmeter实现随机数,MD5加密压测投票接口

    1 新增HTTP请求 nonStr为随机值 sign为加密参数 2 在线程组下添加前置处理器 BeanShell PreProcessor 代码如下 import org apache commons codec digest Digest
  • c++ make_shared

    make shared的使用 shared ptr
  • C++14中binary literals的使用

    一个形如42的值被称作字面值常量 literal 这样的值一望而知 每个字面值常量都对应一种数据类型 字面值常量的形式和值决定了它的数据类型 我们可以将整型字面值写作十进制 基数为10 八进制 基数为8 或十六进制 基数为16 数的形式 以
  • 数据库连接不上的几种情况

    客户端不能连接服务器的情况 首先保证客户端和服务器能够ping通 如果ping不通 请检查以下几点 1 服务器和客户端电脑是否通电 2 交换机是否通电 3 网卡安装是否正常 或者网卡是否在设备管理器被禁用 4 本地连接是否被禁用 5 服务器
  • 公钥 私钥 的理解

    公钥和私钥是成对出现 私钥可以生成公钥 公钥无法生成私钥 私钥加密的内容 可以被公钥解密 公钥加密的内容 可以被私钥解密 举个例子 A 持有自己的私钥 A的私钥生成的公钥被其他人持有 其他人用A的公钥加密的内容 只有用A的私钥才可以解密 且
  • 分享一个java+python双版本源码之基于微信小程序的校园跑腿接单系统 校园快递代领小程序(源码、lw、调试)

    作者 计算机源码社 个人简介 本人七年开发经验 擅长Java Python PHP NET 微信小程序 爬虫 大数据等 大家有这一块的问题可以一起交流 学习资料 程序开发 技术解答 文档报告 如需要源码 可以扫取文章下方二维码联系咨询 Ja
  • target_include_directories([SYSTEM][BEFORE]

    target include directories
  • mybatis获取新增记录的主键

    最近项目中有个需求 需要在新增一条记录后返回该记录的主键 查了下资料 用mybatis可以做 我需要拿第一个方法执行返回的id作为变量传给下面 数据库中该id是记录主键 并且数据库用的是主键自增长 这是前提 有两种方式 第一种方式写法如下
  • 信息化战略规划-CRO-SCM-应用集成-电子商务

    信息化战略规划 CRO SCM 应用集成 电子商务 信息化战略体系 重点 信息系统战略规划 重点 客户关系管理 重点 供应链管理 企业应用集成 电子商务 信息化战略体系 重点 企业战略 目标 企业战略规划 实现目标的规划 企业信息化战略 使
  • 操作系统(四):磁盘调度算法,先来先服务,最短寻道时间优先,电梯算法

    文章目录 一 磁盘结构 二 先来先服务 三 最短寻道时间优先 四 电梯算法 SCAN 一 磁盘结构 盘面 Platter 一个磁盘有多个盘面 磁道 Track 盘面上的圆形带状区域 一个盘面可以有多个磁道 扇区 Track Sector 磁

随机推荐

  • 在echarts中自定义提示框内容

    以折线图为例 在鼠标滑过每个数据标签时 为了更友好地显示数据内容 需要对显示的数据内容作格式化处理 添加自定义内容 这就需要用到tooltip的formatter属性的回调函数 本文将从配置代码和效果两方面来展示它的使用 柱状图的原理类似
  • NCC低代码平台服务搭建指南

    NCC服务搭建 前言 本文档旨在帮助第一次接触NCC的开发人员 搭建NCC开发环境 1 NCC相关资料 开发者社区 https nccdev yonyou com 资料 https pan baidu com s 15V71U7vVOGr8
  • 【论文笔记】TNASP:A Transformer-based NAS Predictor with a Self-evolution Framework

    文章目录 0 摘要 摘要解读 1 Introduction 2 相关工作 3 方法 3 1 Training based network performance predictors 3 2 基于Transformer的预测器 3 3 自演
  • unity3d实现简单的打飞碟游戏

    游戏内容 游戏有n个round 每个round发射10次trial 每个trial的飞碟都可能不同 包括速度角度得分等 使用鼠标进行射击 点中即表示射击成功 游戏要求 使用带缓存的工厂模式来管理飞碟的生产与再利用 工厂使用单例模式 游戏的设
  • python中.argsort()的用法

    argsort 是对数组参数从小到大排序 然后取出排序后的索引 例如 a np array 0 2 0 5 0 3 0 4 a argsort 输出的就是对a数组排序过后的索引 0 2 3 1
  • 三、web端显示之hdfs基本操作

    三台的节点均启动成功之后 完全匹配的上配置的下图所示情况 若启动不成功 则先 root hadoop1 hadoop 3 1 3 stop all sh 再输入ll显示一下 删除每一个集群上的data和logs root hadoop1 h
  • Qt源代码中二进制兼容及d、q指针的理解

    1 二进制兼容的理解 首先按照本文对二进制兼容进行理解 此处是本人的总结 将类的私有属性 不需要暴露的部分 放到私有类中 在类中定义私类的指针进行交互 指针的大小是已知不变的 指针数据类型为Int 4个字节 软件发布后只需要改私类中的部分
  • 安装vmware tools时,kernel版本不匹配问题的解决方法

    安装vmware tools 的时候 提示找不到C header files 此种情况下 按以下步骤操作 1 内核安装完毕后 需要用这个命令确定内核 C header 的安装目录 ls d usr src kernels uname r i
  • 怎样知道自己适不适合做程序员

    编程是一门非常有技术含量的手艺活 待遇和福利相对来说较为丰厚 由于种种原因想要转行做程序员的人 总会有这样的困惑 我是否适合做程序员呢 其实做为一个开发者 有一个学习的氛围跟一个交流圈子特别重要这里我推荐一个C语言C 交流群58365041
  • 全文检索几种词向量模型

    1 倒排索引模型 2 布尔检索类型 3 TF IDF权重计算 下面是TF IDF的JAVA代码实现 public class TFIDF public double tf List
  • vue的循环遍历(v-for)

    1 循环遍历 1 循环遍历 vue的循环遍历用v for 语法类似于js中的for循环 当我们有一组数据需要进行渲染时 我们就可以使用v for来完成 2 v for使用格式 格式为 v for item in items 遍历items中
  • 【Android开发】一文全面解析Framework层

    前言 上一篇文章从Native角度讲解了Android进程管理的相关概念 本文将继续从上层的Framework中的进程启动 销毁场景和优先级处理 以及它们与四大组件的种种关联 来逐步解析Android进程管理的其他关键要素 进程的启动 An
  • 腾讯 Bugly 和 CrashHandler 冲突,不上传日志

    简单介绍 CrashHandler 是继承 UncaughtExceptionHandler 类来处理 app 崩溃 自由度比较大 可以收集日志信息保存到本地 上传网络 并重启应用 可以说是除了三方的异常上报工具 开发者使用最多的一种方式
  • Android Log系统介绍

    前言 日志分析是开发的核心阶段之一 开发人员经常会遇到这样那样的问题 需要借助日志分析来解决 Bug日志有助于在开发阶段识别Android应用中的Bug 一旦应用发布到市场上 开发者 或者支持工程师 也要通过分析bug日志来解决问题 可见
  • EditText横屏键盘全屏的问题

    在EditText的属性 android imeOptions flagNoExtractUi flagNoFullscreen 可以解决问题 一定要设置flagNoFullscreen否则会出现一个切换回竖屏后页面显示不全的问题
  • Citrix_XenDesktop7.5安装图解,实现Citrix虚拟云桌面

    Cirtrix XenDesktop 7 5 安装图解 一 安装 XenDesktop 7 5 安装 Winodws 2012 并加入域 xenad local 计算机名为 xd xenad local 过程略 安装 XenDesktop
  • 【计算机网络09】传输层之TCP连接管理

    文章目录 1 深入理解序号seq 确认号ack 2 建立连接 三次握手 2 1 状态解读 2 2 前 2 次握手的特点 2 3 为什么建立连接要进行 3 次握手 2 次不行吗 2 4 第 3 次握手失败了会怎么处理 3 释放连接 四次挥手
  • 什么是库-适用于当前软件的包

    源头 scrapy学习 scrapy第三方模块 不管官网原理 架构 安装等辅助教程多么花枝招展 最后还是落实到下面第3条说的库的特征 都会体现在lib下的site packages下的scrapy模块里 就是一串串的代码而已 重点 1 内置
  • Python爬虫的scrapy的学习(学习于b站尚硅谷)

    目录 一 scrapy 1 scrapy的安装 1 什么是scrapy 2 scrapy的安装 2 scrapy的基本使用 1 scrap的使用步骤 2 代码的演示 3 scrapy之58同城项目结构和基本方法 注 58同城的数据不是公开数
  • 关于子线程的异常捕获 - UncaughtExceptionHandler

    一 为什么需要Thread UncaughtExceptionHandler 1 主线程可以轻松找到异常 但是子线程不行 子线程异常问题 author xuehw date 2020 03 05 public class Exception