码迷,mamicode.com
首页 > 编程语言 > 详细

线程组中不可控异常的处理

时间:2015-05-03 16:08:27      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:

Java示例:

package concurrency;

import java.util.Random;

public class Main6 {
    public static void main(String[] args) {
        MyThreadGroup threadGroup = new MyThreadGroup("MyThreadGroup");
        Task1 task = new Task1();
        for(int i = 0; i < 2;i++){
            Thread t = new Thread(threadGroup,task);
            t.start();
        }
    }
}

class MyThreadGroup extends ThreadGroup{
    /*必须声明带参数的构造器,因为ThreadGroup没有默认的不带参数的构造器*/
    public MyThreadGroup(String name) {
        super(name);
    }
    /*重写uncaughtException方法*/
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.printf("The thread %s has thrown an Exception\n",t.getId());
        e.printStackTrace(System.out);
        System.out.printf("Terminating the rest of the Threads\n");
        interrupt();
    }
}

class Task1 implements Runnable{
    /*在这个方法里,我们要触发AritmethicException异常,为了达到这个目标,
      *我们用1000除以一个随机数,当随机数生成器生成0,异常将被抛出*/
    @Override
    public void run() {
        int result;
        Random random = new Random(Thread.currentThread().getId());
        while(true){
            result = 1000/((int)(random.nextDouble()*1000));
            System.out.printf("%s : %d\n", Thread.currentThread().getId(),result);
            if(Thread.currentThread().isInterrupted()){
                System.out.printf("%d : Interrupted\n", Thread.currentThread().getId());
                return;
            }
        }
    }
}

当线程抛出非捕获异常时,JVM将为这个异常寻找3种可能的处理器。首先,寻找抛出这个异常的线程的非捕获异常处理器,如果这个处理器不存在,JVM继续查找这个线程所在的线程组的非捕获异常处理器,这也是本节学习的知识,如果也不存在,JVM将寻找默认的非捕获异常处理器。如果这些处理器都不存在,JVM把堆栈中异常信息打印到控制台,并且退出这个程序。

线程组中不可控异常的处理

标签:

原文地址:http://my.oschina.net/fhd/blog/410031

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!