java中给出一个子线程如何捕获主线程异常的例子

马克-to-win:接着我们看子线程如何捕获主线程的异常 

例:1.5.4_2-本章源码
马克- to-win:马克 java社区:防盗版实名手机尾号: 73203。

import java.lang.Thread.UncaughtExceptionHandler;
class ThreadMark_to_win extends Thread  {
    Thread mainT;
    Test test;
    ThreadMark_to_win(Thread t1,Test t2)
    {
        mainT = t1;
        test=t2;
        mainT.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
            public void uncaughtException(Thread t, Throwable e) {
                System.out.println("在子程序处理呢, 传进来的参数是"+test.name+"   "+t.getName()+"   "+ e.getMessage());
            }
        });      
    }
    public void run()
    {
        for(int i=0;i<3;i++)
        { 
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
            }
            System.out.println("在子线程"+i);
        }
    }
}
public class Test {
    String name="马克-to-win在主线程";
    public static void main(String[] args) {
        Thread mainT = Thread.currentThread();
        Test t=new Test();
        ThreadMark_to_win tm = new ThreadMark_to_win(mainT,t);
        tm.start();
        for (int i = 0; i < 3; i++)
        {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
            }
            System.out.println("在主线程" + i);
        }
        throw new RuntimeException("在主线程,我自己抛出的一个异常");
    }
}

输出结果:
在主线程0
在子线程0
在主线程1
在子线程1
在主线程2
在子程序处理呢, 传进来的参数是马克-to-win在主线程   main   在主线程,我自己抛出的一个异常
在子线程2

后续:
马克-to-win:上面的程序通过new ThreadMark_to_win(mainT,t);把主线程的参考指针传进了子线程。事实上,UncaughtExceptionHandler可以不用放在一个线程中,只要找到一个类放置就可以了或放置在它自己里面。(以下会给出一个例子),但既然找到一个类放置就可以,我们就可以把他放在另一个线程(一个线程就是一个类)中,达到别的线程处理当前线程的异常的目的。




例:1.5.4_3-本章源码

import java.lang.Thread.UncaughtExceptionHandler;
class ThreadMark_to_win  {
    Thread mainT;
    Test test;
    ThreadMark_to_win(Thread t1,Test t2)
    {
        mainT = t1;
        test=t2;
        mainT.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
            public void uncaughtException(Thread t, Throwable e) {
                System.out.println("在子程序处理呢, 传进来的参数是"+test.name+"   "
                        +t.getName()+"   "+ e.getMessage());
            }
        });      
    }
}
public class Test {
    String name="马克-to-win在主线程";
    public static void main(String[] args) {
        Thread mainT = Thread.currentThread();
        Test t=new Test();
        ThreadMark_to_win tm = new ThreadMark_to_win(mainT,t);
        for (int i = 0; i < 3; i++)
            System.out.println("在主线程" + i);
        throw new RuntimeException("在主线程,我自己抛出的一个异常");
    }
}

输出结果:

在主线程0
在主线程1
在主线程2
在子程序处理呢, 传进来的参数是马克-to-win在主线程   main   在主线程,我自己抛出的一个异常




例:1.5.4_4

import java.lang.Thread.UncaughtExceptionHandler;
public class Test {
    String name="马克-to-win在主线程";
    public static void main(String[] args) {
        Thread mainT = Thread.currentThread();
        Test t=new Test();
       // ThreadMark_to_win tm = new ThreadMark_to_win(mainT,t);
        mainT.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
            public void uncaughtException(Thread th, Throwable e) {
                System.out.println("在子程序处理呢, 传进来的参数是"+t.name+"   "
                        +th.getName()+"   "+ e.getMessage());
            }
        });
        for (int i = 0; i < 3; i++)
            System.out.println("在主线程" + i);
        throw new RuntimeException("在主线程,我自己抛出的一个异常");
    }
}

结果:

在主线程0
在主线程1
在主线程2
在子程序处理呢, 传进来的参数是马克-to-win在主线程   main   在主线程,我自己抛出的一个异常