Java多线程 需要UncaughtException的3个理由
发布日期:2021-06-30 13:12:03
浏览次数:2
分类:技术文章
本文共 1687 字,大约阅读时间需要 5 分钟。
文章目录
线程未捕获的异常UncaughtException应该如何处理
使用UncaughtExceptionHandler 的3个理由:
理由一: 主线程可以轻松的发现异常, 子线程却无法发现异常.
如下的代码演示了子线程发生了运行时异常, 但是主线程依然会继续运行的线程
/** * 类名称:ExceptionInChildThread * 类描述: 多线程,子线程发生异常. 主线程不会停止运行 * * @author: https://javaweixin6.blog.csdn.net/ * 创建时间:2020/8/30 18:38 * Version 1.0 */public class ExceptionInChildThread implements Runnable{ public static void main(String[] args) { //启动子线程 new Thread(new ExceptionInChildThread()).start(); //模拟主线程的逻辑处理 for (int i = 0; i < 1000; i++) { System.out.println(i); } } @Override public void run() { //模拟在子线程中发生运行时异常. throw new RuntimeException(); }}
通过控制台可以看到, 虽然打印出了子线程的异常, 但是主线程依然继续运行, 不受影响.
这样的后果是, 如果在生产环境中, 即使子线程发生了异常, 但是只是打印出了大量的异常信息, 那么查找异常信息时, 就会很困难.理由二: 子线程的异常, 无法用传统的办法进行捕获
未使用try catch 时的代码如下. 子线程直接抛出一个运行时的异常
public class CantCatchDirectly implements Runnable{ public static void main(String[] args) throws InterruptedException { 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(); } @Override public void run() { throw new RuntimeException(); }}
控制台打印如下. 打印出了子线程的四个异常信息.
将上面的代码稍作修改, 使用try catch进行捕获 再次运行代码, 发现还是打印出了异常信息, 说明主线程并没有捕获到子线程的异常信息 .说明了子线程的异常, 无法用传统的办法进行捕获. 主要的原因是try catch的捕获异常, 是针对本线程的, 无法捕获子线程的异常.理由三: 不能直接捕获的后果, 提高健壮性
如果不捕获异常, 后果就是子线程直接结束了运行, 可能造成数据的丢失等安全性问题. 捕获了子线程的异常, 提高程序的健壮性. 可以重启线程 , 系统报警等等.
转载地址:https://javaweixin6.blog.csdn.net/article/details/108309447 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2024年04月25日 04时09分51秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
使用redis实现订阅功能
2019-05-01
Redis主从配置
2019-05-01
Redis哨兵机制
2019-05-01
哨兵机制服务器环境准备
2019-05-01
携程Apollo动态配置日志级别
2019-05-01
SpringBoot整合Redis事务
2019-05-01
项目整合一级缓存和二级缓存
2019-05-01
自定义注解和aop抽取重复代码
2019-05-01
互联网API开放平台安全设计-基于OAuth2.0协议方式
2019-05-01
URL特殊字符转码
2019-05-01
对称加密整个过程
2019-05-01
java内存模型
2019-05-01
volatile关键字
2019-05-01
web服务器软件_概述
2019-05-01
tomcat_启动问题分析
2019-05-01
tomcat_关闭
2019-05-01
tomcat_部署项目的方式
2019-05-01
tomcat_动态java项目的目录结构
2019-05-01
Servlet_概述
2019-05-01
Servlet_快速入门
2019-05-01