拾遗增补(六)——线程组内处理异常

  创建名称为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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值