正确捕获子线程异常的姿势

我们都知道在线程在出现异常的时候,这条线程会终止。而在多线程环境下,是无法用传统方法来捕获子线程的异常,也就是说无法处理,现在我们来模拟一下这种情况

public class Test7 implements Runnable {
	
	public static void main(String[] args) throws InterruptedException {
		  Test7 test7 = new Test7();
	       try {
	      new Thread(test7,"线程-1").start();
	      Thread.sleep(200);
	      new Thread(test7,"线程-2").start();
	      Thread.sleep(200);
	      new Thread(test7,"线程-3").start();
	      Thread.sleep(200);
	      new Thread(test7,"线程-4").start();
		  } catch (Exception e) {
				// TODO: handle exception
			  e.printStackTrace();
			  System.out.println("捕获到子线程异常");
			}
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		throw new RuntimeException();   //模拟一个RuntimeException异常
		
	}

}

运行结果:
在这里插入图片描述
并没有打印出我们期望的 catch语句块的内容。

针对这种无法捕获子线程异常的情况,有两种方法

第一种方法:
1.在run方法里面用 try catch 捕获 ,这种方法虽然可行 ,但是每个run方法都要写一遍,并且有可能还不知道线程具体抛出的异常类型。 这种方式简单就不在演示了。

第二种方法:
2.使用Thread类的UncaughtExceptionHandler

public class Test7 implements Runnable {
	
	public static void main(String[] args) throws InterruptedException {
		 Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler("捕获器1"));
		  Test7 test7 = new Test7();
	      new Thread(test7,"线程-1").start();
	      Thread.sleep(200);
	      new Thread(test7,"线程-2").start();
	      Thread.sleep(200);
	      new Thread(test7,"线程-3").start();
	      Thread.sleep(200);
	      new Thread(test7,"线程-4").start();
	    
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
				throw new RuntimeException();	 
	}

}

class MyUncaughtExceptionHandler implements UncaughtExceptionHandler {

	private String name;
	
	public MyUncaughtExceptionHandler(String name) {
		this.name = name;
	}

	@Override
	public void uncaughtException(Thread t, Throwable e) {
		// TODO Auto-generated method stub
		Logger logger = Logger.getAnonymousLogger();
		logger.log(Level.WARNING,"线程异常",e);
		System.out.println(name+"捕获了"+t.getName()+"异常:"+e);
	}
	
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值