多线程情况下如何捕获线程中的异常?
Posted 江苏万和IT教育
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程情况下如何捕获线程中的异常?相关的知识,希望对你有一定的参考价值。
sefd
摘要:本文主要介绍使用UncaughtExceptionHandler,该如何正确的捕捉线程中的异常。
写的时候最好要设置线程名称 Thread.name,并设置线程组 ThreadGroup,目的是方便管理。在出现问题的时候,打印线程栈 (jstack -pid) 一眼就可以看出是哪个线程出的问题,这个线程是干什么的。
方法一 Thread方式通过线程组,线程名,并设置UncaughtExceptionHandler来捕获异常
输出如下:
catch 到了
输出如下:
方法二 使用ExecutorService来捕获线程
- 由于线程的本质特性,使得你不能捕获从线程中逃逸的异常。一旦异常逃出任务的run()方法它就会向外传播到控制台,除非你采取特殊的步骤捕获这种错误的异常。
- 在Java SE5之前,你可以使用线程组来捕捉这种异常,但是有了Java SE5,就可以用Executor来解决这个问题了。
- 下面的任务总是会抛出一个异常,该异常会传播到其run()方法的外部,并且main()展示了当你运行它时所发生的事情:
输出如下:
这将产生于前面示例相同的结果:未捕获的异常。
- 为了解决这个问题,我们要修改Executor产生线程的方式。Thread.UncaughtExceptionHandler是Java SE5中的新接口,它允许你在每个Thread对象上都附着一个异常处理器。
- Thread.UncaughtExceptionHandler.uncaughtException()会在线程因未捕获的异常而临近死亡时被调用。为了使用它,我们创建了一个新类型的ThreadFactory,它将在每个新创建的Thread对象上附着一个Thread.UncaughtExceptionHandler。
执行的结果如下:
可以看到,线程池中有2个线程,当一个线程发生异常时,该异常被捕捉了。
上面的示例使得你可以按照具体情况(在newThread()方法中使用if, case等语句)为每个线程逐个的设置处理器。如果你知道将要在代码中处处使用相同的异常处理器,那么更简单的方式是在Thread类中设置一个静态域,并将这个处理器设置为默认的处理器即可:
这个处理器只有在不存在线程专有的未捕获异常处理器的情况下才会被调用。系统会检查线程专有版本,如果没有发现,则检查线程组是否有专有的uncaughtException()方法,如果也没有,才会调用defaultUncaughtExceptionHandler。
原文:https://blog.csdn.net/pad12270828/article/details/54582646
点击阅读原文
申请免费课程
以上是关于多线程情况下如何捕获线程中的异常?的主要内容,如果未能解决你的问题,请参考以下文章
当其中一个线程中存在未捕获的异常时,Python 多线程程序不会退出