最近一段时间,看了看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表达式,不明白的自己百度吧,希望大家能有收获。
每天都要努力呀,加油!!!
100

被折叠的 条评论
为什么被折叠?



