首页 > 其他分享 >父线程捕获子线程的异常方式

父线程捕获子线程的异常方式

时间:2023-06-03 18:22:21浏览次数:35  
标签:Thread 捕获 线程 println new 异常 public

如果 子线程出现异常问题 如果不在父线程中进行捕获异常 该子线程也不进行异常捕获的话 则子线程一但出现异常 则此子线程就关闭了,父线程并不知情,可能认为该子线程已经正常、运行完毕了呢,所以突显出父线程捕获子线程异常状态的重要性。在普通的单线程程序中,捕获异常只需要通过try ... catch ... finally ...代码块就可以了。那么在并发情况下,比如在父线程中启动了子线程,如何在父线程中捕获子线程中的异常,从而进行相应的处理呢?为线程设置异常处理器。具体做法有一下两种:
(1)Thread.setUncaughtExceptionHandler设置当前线程的异常处理器;
(2)Thread.setDefaultUncaughtExceptionHandler为整个程序设置默认的异常处理器;
线程出现异常,如果当前线程有异常处理器(默认没有),则优先使用该线程的异常处理器,否则,如果当前线程所属的线程组存在异常处理器,则使用线程组的异常处理器;否则,使用全局默认的DefaultUncaughtExceptionHandler;如果都没有的话,子线程就会退出。

1.设置当前线程的异常处理器

package com.example.springbootstudy.test.exception;

public class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {

    public void uncaughtException(Thread t, Throwable e) {
        System.out.println("MyUncaughtExceptionHandler do something...");
        System.out.println("errorMsg:" + e.getMessage());
    }

}
package com.example.springbootstudy.test.exception;

public class ChildTask implements Runnable {

    public void run() {
        Thread.currentThread().setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
        System.out.println("do something");
        throw new RuntimeException("ChildTask异常");
    }

    public static void main(String[] args) {
        Thread t= new Thread(new ChildTask());
        t.start();
    }


}

程序运行结果如下所示:

do something
MyUncaughtExceptionHandler do something...
errorMsg:ChildTask异常

2、设置默认异常处理器

package com.example.springbootstudy.test.exception;

public class AppTest {

    public static void main(String[] args) {
        Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
        Thread t= new Thread(new ChildTask());
        t.start();
    }
}

class ChildTask2 implements Runnable {

    public void run() {
        System.out.println("do something");
        throw new RuntimeException("ChildTask异常");
    }

}

3、Future的get
使用线程池提交一个能获取到返回信息的方法,也就是ExecutorService.submit(Callable) 在submit之后可以获得一个线程执行结果的Future对象,而如果子线程中发生了异常,通过future.get()获取返回值时,可以捕获到 ExecutionException异常,从而知道子线程中发生了异常。

 1 package com.example.springbootstudy.test.exception;
 2 
 3 import java.util.concurrent.*;
 4 
 5 public class childTask2 {
 6 
 7     public static void main(String[] args) {
 8         System.out.println("main...");
 9         ExecutorService executorService = Executors.newCachedThreadPool();
10         Future<String> future = executorService.submit(new App());
11         try {
12             String s = future.get();
13         } catch (InterruptedException e) {
14             System.out.println("InterruptedException");
15         } catch (ExecutionException e) {
16             System.out.println(e.getMessage());
17         }
18     }
19 }
20 
21 
22 class App implements Callable<String> {
23 
24     @Override
25     public String call() throws Exception {
26         System.out.println("do something");
27         throw new Exception("ChildTask2异常");
28     }
29 
30 }

总结:以上是三种父线程获取子线程的异常总结。

 

标签:Thread,捕获,线程,println,new,异常,public
From: https://www.cnblogs.com/jelly12345/p/17454349.html

相关文章

  • 记录一次QT5下多线程使用Qxlsx操作写EXCEL表文件问题
    问题表述:一个主线程和两个子线程,两个子线程进行写EXCEL表格文件,线程1写demo_1.xlsx,线程2写demo_2.xlsx,运行一段时间后程序异常退出?。代码如下://两个线程代码一样,只是写入的文件名不同QXlsx::Documentdocument("demo_x.xlsx");introwLen=document.dimension()......
  • java子线程中获取父线程的threadLocal中的值
    1packagecom.example.springbootstudy.test.threadLocal;23publicclassBaseTest{45publicstaticfinalInheritableThreadLocal<String>inheritableThreadLocal=newInheritableThreadLocal<>();67publicstaticfinalThrea......
  • 【python】多线程
     在Python3中,通过threading模块提供线程的功能。原来的thread模块已废弃。但是threading模块中有个Thread类(大写的T,类名),是模块中最主要的线程类,一定要分清楚了,千万不要搞混了。threading模块提供了一些比较实用的方法或者属性,例如:方法与属性描述current_thread()返......
  • 集合,多线程,面向对象,方法覆盖
    集合:“父亲”collection"儿子":list:有序,有下标,查set:无序,无下标,修改(底层:内存存储方式)列表,不方便map:键值对,key(标号)-value(真实的值,储放的是分散的物品,小型数据库)多线程:进程(可以索取计算机运行资源)=多线程(不可以索取,只能进程的资源)oop面向对象=封装,继承,多态面向过程:按照......
  • 线程的四个属性
    如上图所示,线程有四个属性:线程ID线程名称守护线程线程优先级1.线程ID每个线程都有id,这个id不能修改线程id会不停的自增,从1开始main函数就是第一个线程,id=1id是操作系统用来识别各个线程的编号,具有唯一性,从下面java的源码中看到,这个线程的Id初始值是0,但是......
  • 多线程的未捕获异常类 UncaughtExceptionHandler 的使用
    一、需要UncaughtExceptionHandler的原因1.主线程可轻松的发现异常,子线程的异常比较隐蔽,难以发现程序运行时,子线程发生了异常,并不影响主线程,也不会终止主线程的程序,主线程将继续执行,这时候子线程的异常可能就不会被察觉,就使得子线程的功能出了问题,但没发现。代码展示:/***......
  • 多线程安全的案例展示与解决方案
    一、概念1.什么是线程安全当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。通俗来说就是:不管业务中遇到怎么的多个线......
  • 多线程-线程池与java内存模型
    多线程-线程池与java内存模型线程池的使用(思路:什么是线程池->他的基本构造以及参数含义->如何使用,使用过程中需要注意什么->有哪些好用的工具类)线程池的基笨概念:首先看一下的继承关系,其次看他的状态,它是利用int的高三位表示状态,比如111表示能接受任务,具体看下面第二章图接下来看......
  • 使用GAN进行异常检测——可以进行网络流量的自学习哇,哥哥,人家是半监督,无监督的话,还是
    实验了效果,下面的还是图像的异常检测居多。https://github.com/LeeDoYup/AnoGANhttps://github.com/tkwoo/anogan-keras看了下,本质上是半监督学习,一开始是有分类模型的。代码如下,生产模型和判别模型:###generatormodeldefinedefgenerator_model():inputs=Input((10,))......
  • CNN autoencoder 进行异常检测——TODO,使用keras进行测试
    https://sefiks.com/2018/03/23/convolutional-autoencoder-clustering-images-with-neural-networks/https://blog.keras.io/building-autoencoders-in-keras.htmlhttps://www.kaggle.com/atom1231/keras-autoencoder-with-simple-cnn-kfold4-lb-1704 https://datascience.st......