Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java的Thread线程对象对异常捕获的处理策略

Java的Thread线程对象对异常捕获的处理策略

作者头像
崔认知
发布于 2024-09-18 05:45:08
发布于 2024-09-18 05:45:08
20300
代码可运行
举报
文章被收录于专栏:nobodynobody
运行总次数:0
代码可运行

Java世界里线程无处不在,如果线程抛出了异常,是如何处理的呢?

线程对异常的处理主要涉及到java.lang.Thread.UncaughtExceptionHandler

‍‍

当一个线程即将因为一个未捕获的异常而终止时,Java虚拟机会使用getUncaughtExceptionHandler查询线程的未捕获异常处理器,并调用处理器的uncaughtException方法,将线程和异常作为参数传递。如果一个线程没有明确设置其未捕获异常处理器,那么它的ThreadGroup对象就充当其未捕获异常处理器。如果ThreadGroup对象没有特别的要求来处理异常,它可以将调用转发给默认的未捕获异常处理器

1、线程明确设置其未捕获异常处理器

通过java.lang.Thread#setUncaughtExceptionHandler方法设置此线程的异常处理器,当此线程由于未捕获的异常而突然终止时调用的处理程序,示例如下:

源码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.renzhikeji.demo;

/**
 * @author 认知科技技术团队
 * 微信公众号:认知科技技术团队
 */
public class ThreadDemo {

    public static void main(String[] args) throws  Exception{
        ThreadGroup threadGroup = new ThreadGroup("认知科技技术团队-ThreadGroup"){
            @Override
            public void uncaughtException(Thread t, Throwable e) {
                System.out.println("threadGroup uncaughtException:"+ e.getMessage());
            }
        };

        Thread thread = Thread
                .ofPlatform()
//                .group(threadGroup)
                .name("认知科技技术团队-thread")
                .uncaughtExceptionHandler((t, e) -> {
                    System.out.println("Thread UncaughtExceptionHandler:"+ e.getMessage());
                })
                .start(() -> {
                    throw new RuntimeException("test exception");
                });


        thread.join();

        System.out.println(thread.isAlive());
    }
}

执行结果:

2、线程组设置捕获异常处理器

线程组默认的异常处理会一直迭代调用其父线程组的异常处理器,直到父线程组对象为空,最终会调用Thread类全局默认的异常处理器,如果都没有,则会把异常信息输出到标准错误流

源码:java.lang.ThreadGroup#uncaughtException

我们一般重写线程组设置捕获异常处理器,示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.renzhikeji.demo;

/**
 * @author 认知科技技术团队
 * 微信公众号:认知科技技术团队
 */
public class ThreadDemo {

    public static void main(String[] args) throws  Exception{
        //重写线程组异常处理
        ThreadGroup threadGroup = new ThreadGroup("认知科技技术团队-ThreadGroup"){
            @Override
            public void uncaughtException(Thread t, Throwable e) {
                System.out.println("threadGroup uncaughtException:"+ e.getMessage());
            }
        };

        Thread thread = Thread
                .ofPlatform()
                //设置线程组,使用线程组异常处理
                .group(threadGroup)
                .name("认知科技技术团队-thread")
                .start(() -> {
                    throw new RuntimeException("test exception");
                });


        thread.join();

        System.out.println(thread.isAlive());
    }
}

输出结果:

3、线程全局异常处理器

通过java.lang.Thread#setDefaultUncaughtExceptionHandler方法设置全局异常处理器,当线程由于未捕获的异常而突然终止时调用其默认处理器处理,示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.renzhikeji.demo;

/**
 * @author 认知科技技术团队
 * 微信公众号:认知科技技术团队
 */
public class ThreadDemo {

    public static void main(String[] args) throws  Exception{

        //设置线程全局异常处理器
        Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread t, Throwable e) {
                System.out.println("Thread DefaultUncaughtExceptionHandler :"+ e.getMessage());
            }
        });

        Thread thread = Thread
                .ofPlatform()
                .name("认知科技技术团队-thread")
                .start(() -> {
                    throw new RuntimeException("test exception");
                });


        thread.join();

        System.out.println(thread.isAlive());
    }
}

执行结果:

利用线程池处理业务时,有时候需要我们自己对线程异常要捕获,不能过度依赖线程处理器,否则可能导致线程退出。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-09-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 认知科技技术团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java-线程中的异常
给出以下例子,我想问题是线程t1运行期间抛出的异常能够被捕获吗?(这是一个相当好的问题~)
Fisherman渔夫
2020/02/19
1.5K0
多线程中如何进行异常处理?
线程不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked exception处理掉。我们可以查看一下Thread类的run()方法声明,方法声明上没有对抛出异常进行任何约束。
joshua317
2022/03/29
1.3K0
多线程中如何进行异常处理?
Java多线程:捕获线程异常
你处理过多线程中的异常吗?如何捕获多线程中发生的异常?捕获子线程的异常与捕获当前线程的异常一样简单吗? 除了try catch。Java中还可以通过异常处理器UncaughtExceptionHandler来处理那些未捕获的异常。 # 在当前线程捕获当前线程发生的异常: /** * @author futao * @date 2020/6/17 */ @Slf4j public class ExceptionInCurThread { public static void main(Strin
喜欢天文的pony站长
2020/06/29
3.6K0
Java多线程:捕获线程异常
最全java多线程学习总结1--线程基础
  《java 核心技术》这本书真的不错,知识点很全面,翻译质量也还不错,本系列博文是对该书中并发章节的一个总结。
用户2038589
2019/07/03
4810
java 多线程异常处理
默认主线程创建了一个尝试除0而故意抛出ArithmeticException对象的runnable        按照下面的方式编译清单        javac ExceptionThread.java        运行程序        java ExceptionThread 你会看到类ArithmeticException的实例抛出的一条异常栈信息:
阿珍
2025/05/06
1160
java 多线程异常处理
03.Android崩溃Crash库之ExceptionHandler分析
目录总结 00.异常处理几个常用api 01.UncaughtExceptionHandler 02.Java线程处理异常分析 03.Android中线程处理异常分析 04.为何使用setDefaultUncaughtExceptionHandler 前沿 上一篇整体介绍了crash崩溃库崩溃重启,崩溃记录记录,查看以及分享日志等功能。 项目地址:https://github.com/yangchong211/YCAndroidTool 欢迎star 00.异常处理几个常用api setUncaughtEx
杨充
2020/09/07
2K0
JVM 如何处理未捕获异常
继之前的文章 详解JVM如何处理异常,今天再次发布一篇比较关联的文章,如题目可知,今天聊一聊在JVM中线程遇到未捕获异常的问题,其中涉及到线程如何处理未捕获异常和一些内容介绍。
技术小黑屋
2020/01/21
1.6K0
Java异常体系、UncaughtExceptionHandler、Spring MVC统一异常处理、Spring Boot统一异常处理
所有异常都是继承自java.lang.Throwable类,Throwable有两个直接子类,Error和Exception。
johnny666
2024/09/25
2150
聊一聊未捕获异常与进程退出的关联
之前的文章JVM 如何处理未捕获异常 我们介绍了JVM如何处理未捕获异常,今天我们研究一个更加有意思的问题,就是在JVM中如果发生了未捕获异常,会导致JVM进程退出么。
技术小黑屋
2020/02/10
1.5K0
01.崩溃捕获设计实践方案
杨充
2023/08/29
4750
异常处理器详解 Java多线程异常处理机制 多线程中篇(四)
你会发现,然而并没有什么卵用,主线程中的try catch并不会得到什么信息,跟原来的结果还是一样的,线程直接宕掉
noteless
2019/03/04
1.6K0
异常处理器详解 Java多线程异常处理机制  多线程中篇(四)
【Java 基础篇】Java线程异常处理详解
在多线程编程中,异常处理是一个至关重要的方面,它决定了你的多线程应用程序的稳定性和可靠性。在本篇博客中,我们将深入探讨Java中的线程异常处理,包括线程抛出的异常类型、如何捕获和处理异常以及最佳实践。
繁依Fanyi
2023/10/12
4930
【Java 基础篇】Java线程异常处理详解
Unhandled Exception: 处理未捕获异常的最佳实践 ️
大家好,我是默语,擅长全栈开发、运维和人工智能技术。未捕获异常(Unhandled Exception)是软件开发中常见的问题,会导致程序崩溃和用户体验下降。在本文中,我将分享处理未捕获异常的最佳实践,帮助大家提高程序的稳定性和可靠性。关键词:未捕获异常、异常处理、Java、最佳实践。
默 语
2024/11/22
8410
(九)线程池异常捕获
上一篇提到了使用ThreadFactory的UncaughtExceptionHandler去捕获线程池的错误,还有没有其他方法呢?
HaC
2020/12/30
1.6K0
面试官:线程池如何按照core、max、queue的执行循序去执行?(内附详细解析)
前几天一个朋友在群里分享了他刚刚面试候选者时问的问题:"线程池如何按照core、max、queue的执行循序去执行?"。
一枝花算不算浪漫
2020/06/16
1.7K0
面试官:线程池如何按照core、max、queue的执行循序去执行?(内附详细解析)
Java线程池中线程抛了异常,该如何处理?
线程池是Java中非常常用的一种多线程实现方式,它可以有效地管理线程资源,提高程序的运行效率。然而,在使用线程池的过程中,如果线程抛出异常,就需要及时处理,避免对整个程序造成影响。本文将介绍如何处理线程池中线程抛出的异常。
用户1289394
2023/08/22
1.1K0
Java线程池中线程抛了异常,该如何处理?
如何处理JDK线程池内线程执行异常?讲得这么通俗,别还搞不懂
当提交到线程池的任务执行抛出异常时, 会被下方的 catch 块捕获, 向 JVM 抛出异常
Java程序猿阿谷
2020/11/12
4520
如何处理JDK线程池内线程执行异常?讲得这么通俗,别还搞不懂
Thread的源码解析
  Java线程中的Runnable状态包括操作系统线程的running和ready状态,处于就绪状态的线程一旦获得CPU使用权,进入运行状态
余生大大
2022/11/02
6390
线程池合理使用规范
如果核心线程数量设置得过高,可能会导致CPU过度调度,增加上下文切换的开销,甚至耗尽系统可用的线程资源。
星辰大海的精灵
2024/08/06
1120
线程池异常处理的 5 中方式
在我进行 Java 编程实践当中,特别是高性能编程时,线程池是无法逾越的高山。在最近攀登高山的路途上,我又双叒叕掌握了一些优雅地使用线程池的技巧。
FunTester
2025/01/23
1480
线程池异常处理的 5 中方式
相关推荐
Java-线程中的异常
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验