创建名称为7.6项目。
创建MyThread.java类代码如下:
public class MyThread extends Thread{
private String num;
public MyThread(ThreadGroup group, String name, String num) {
super(group, name);
this.num = num;
}
@Override
public void run() {
int numInt = Integer.parseInt(num);
while (true) {
System.out.println("死循环中:" + Thread.currentThread().getName());
}
}
}
创建运行类Run.java代码如下:
public class Run {
public static void main (String[] args) {
ThreadGroup group = new ThreadGroup("我的线程组");
MyThread[] myThread = new MyThread[10];
for (int i = 0; i < myThread.length; i++) {
myThread[i] = new MyThread(group, "线程" + (i + 1), "1");
myThread[i].start();
}
MyThread newT = new MyThread(group, "报错线程", "a");
newT.start();
}
}
程序运行后,其中一个线程出现异常,但其他线程却一直以死循环的方式持续打印结果,如下所示:
死循环中:线程9
死循环中:线程9
死循环中:线程9
死循环中:线程9
死循环中:线程10Exception in thread "报错线程" java.lang.NumberFormatException: For input string: "a"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:447)
at java.lang.Integer.parseInt(Integer.java:497)
at extthread.MyThread.run(MyThread.java:11)
红色按钮变成灰色是因为被用鼠标强制停止,而while(true)死循环是无限输出的。
从运行的结果来看,在默认的情况下,线程组中的一个线程出现异常不会影响其他线程的运行。
如果要实现线程组内一个线程出现异常后,全部线程都停止运行的话,需要如何实现呢?
创建项目7.6_2,创建新的线程组MyThreadGroup.java类,代码如下:
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();
}
}
public void uncaughtException(Thread t, Throwable e)方法中的t参数是出现异常的线程对象。
类MyThread.java代码如下:
public class MyThread extends Thread {
private String num;
public MyThread(ThreadGroup group, String name, String num) {
super(group, name);
this.num = num;
}
@Override
public void run() {
int numInt = Integer.parseInt(num);
while (this.isInterrupted() == false) {
System.out.println("死循环中:" + Thread.currentThread().getName());
}
}
}
需要注意的是,使用自定义java.lang.ThreadGroup线程组,并且重写uncaughtException方法处理组内线程中断行为时,每个线程对象中的run()方法内部不要有异常catch语句,如果有catch语句,则public void uncaughtException(Thread t, Throwable e)不执行。
类Run.java代码如下:
public class Run {
public static void main(String[] args) {
MyThreadGroup group = new MyThreadGroup("我的线程组");
MyThread[] myThread = new MyThread[10];
for (int i = 0; i < myThread.length; i++) {
myThread[i] = new MyThread(group, "线程" + (i + 1), "1");
myThread[i].start();
}
MyThread newT = new MyThread(group, "报错线程", "a");
newT.start();
}
}
程序运行后,其中一个线程出现异常,其他线程全部停止了。结果如下所示:
死循环中:线程1
死循环中:线程3
死循环中:线程9
Exception in thread "报错线程" java.lang.NumberFormatException: For input string: "a"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at MyThread.run(MyThread.java:9)
以上代码下载请点击该链接:https://github.com/Yarrow052/Java-package.git