首先自定义一个遇到异常可以有中断能力的线程组,如下:
package com.example.springboot.codedemo;
public class MyThreadGroup extends ThreadGroup {
public MyThreadGroup(String name) {
super(name);
}
@Override
public void uncaughtException(Thread t, Throwable e) {
super.uncaughtException(t, e);
this.interrupt();
}
}
测试demo:
import java.util.concurrent.TimeUnit;
public class Test {
static class MyThread extends Thread {
private String number;
public MyThread(ThreadGroup group, String name, String number) {
super(group, name);
this.number = number;
}
@Override
public void run() {
//这步类型转换是要故意制造异常
int num = Integer.parseInt(number);
while (!Thread.currentThread().isInterrupted()) {
System.out.println(Thread.currentThread().getName() + "正在运行");
}
System.out.println(Thread.currentThread().getName() + "结束运行");
}
}
public static void main(String[] args) throws InterruptedException {
MyThreadGroup threadGroup = new MyThreadGroup("我的线程组");
for (int i = 1; i <= 3; i++) {
new MyThread(threadGroup, "线程" + i, "6").start();
}
//制造一个异常线程
new MyThread(threadGroup, "异常线程", "a").start();
TimeUnit.SECONDS.sleep(2);
//再启一个正常线程
new MyThread(threadGroup, "正常线程", "1").start();
}
}
运行结果如下:
从红框中的内容可以发现,其实如果没有在睡眠2秒后重新启动一个正常线程,程序是可以正常结束运行的。
总结
从以上的输出结果可以得出,重写了自定义线程组的uncaughtException()方法后,加上相应的中断操作和判断,是可以做到当某个线程出现异常然后中断时,其他的线程也会马上运行结束,不过这里的其他线程指得是当前和出现异常的线程在同一线程组的线程们,而在异常线程之后新加入线程组的线程就不会被影响到的,从正常线程可以持续运行下去就可以证明这点,所以即使采取了异常中断的手段,但是当线程组内的某个线程出现异常,只会影响到当前在线程组内的线程的运行情况,异常之后才加入到线程组的线程就不会被停止了。