浅谈Java线程组 重点——线程群组异常处理

最近一段时间,看了看java的线程组,对于java线程组的基本操作有了一些掌握,特来分享给大家。

言归正传,传说中,啊不对,每一个线程都属于一个线程群组,在main方法里面写入的一个线程,那么他的就属于main的线程群组,来段代码看看。
在这里插入图片描述
使用图中的方法就能得到这个线程所属的线程群组。

之后还是看重点,线程群组是怎样来处理异常的。我不是很喜欢先知道流程或者是概念,先来个引例吧,我现在要做一个线程群组,之后在这个线程群组里面写一个线程,这个线程直接抛出异常,我们看看他是怎么对异常进行处理的。

public class ThreadGroupDemo {
	public static void main(String [] args) {
		ThreadGroup group = new ThreadGroup("group") {
			@Override
			public void uncaughtException(Thread thread, Throwable throwable) {
				System.out.println(thread.getName() + throwable.getMessage());
			}
		};
		Thread thread1 = new Thread(group,()->{
			//这里面省略的是一个类
			throw new RuntimeException("测试异常");
		});
		thread1.start();
	}
}

我自己重写了ThreadGroup的uncaughtException方法,里面输出的是线程的名称,和异常信息。我们看看运行结果。

Thread-0测试异常

看来是调用了群组里面的那个uncaughtException()方法。
那么回正题,线程群组的异常处理流程,当一个线程出现错误的时候,分以下三步:
1、首先看是不是属于某个线程群组,如果是,调用线程群组的uncaughtException方法
2、如果 1 不成立, 那么继续看线程是不是ThreadDeath实例,如果是,直接结束
3、如果 2 不成立,直接调用异常的printStack()方法。

但!是!
这个是JDK5之前的处理方式,JDK5之后发生了一些改变,变成了以下三步:
1、同上述第一步
2、当 1 不成立,看看线程是不是使用 setUncaughtExceptionHandler()方法设置了 Thread.UncaughtExceptionHandler实例 如果有的话就执行这个实例的uncaughtException()方法
3、如果 2 不成立,判断是不是ThreadDeath实例,是就不做,不是就调用异常的printStack()方法。

下面的代码对上述加以解释

public class ThreadGroupDemo {
	public static void main(String [] args) {
		ThreadGroup group = new ThreadGroup("group");
		Thread thread0 = new Thread(group,()->{
			//这里面省略的是一个类
			throw new RuntimeException("测试异常");
		});
		Thread thread1 = new Thread(group,()-> {
			throw new RuntimeException("测试错误");
		});
		thread0.setUncaughtExceptionHandler((thread, throwable)-> {
			System.out.println(thread.getName() + throwable.getMessage());
		});
		thread1.start();
		thread0.start();
	}
}

输出的结果是这样的:

Exception in thread "Thread-1" Thread-0测试异常
java.lang.RuntimeException: 测试错误
	at ThreadGroupLearning.ThreadGroupDemo.lambda$1(ThreadGroupDemo.java:11)
	at java.lang.Thread.run(Unknown Source)

对,线程0是设定了那个实例的,调用的就是自己设定的setUncaughtExceptionHandler()方法,但是Thread1没设置,而且群组也没设置uncaughtException() 的处理,也不是ThreadDeath实例(真悲惨……),所以就调用了异常的printStack()方法。

好了,差不多也就到这儿了,这里面有好多Lambada表达式,不明白的自己百度吧,希望大家能有收获。
每天都要努力呀,加油!!!

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:书香水墨 设计师:CSDN官方博客 返回首页
评论

打赏作者

爱出bug的代码小白

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值