JAvaスレッドunchecked異常の処理UncaughtExceptionHandler

2719 ワード

Threadのrun法は検査型異常(checked exception)を放出しないが,それ自体が異常によって終了し,このスレッドの終了を招く可能性がある.最も面倒なのは、スレッドに投げ出された異常がメインスレッドでtryを使用しても...catchもキャプチャできないため、異常時にシステムリソースを回収できないか、現在の接続を閉じていないなどの問題が発生する可能性があります.
メインスレッドがサブスレッドから放出されるRuntimeExceptionを処理しないのは,スレッドが非同期でサブスレッドが終了していないため,メインスレッドが終了している可能性がある.
UncaughtExceptionHandlerの名前は、取得されていない例外を処理することを意味します.より明確には、キャプチャされていないランタイム異常を処理します.Javaコンパイラでは、実行されていないすべての例外を処理する必要があります.そうしないと、プログラムはコンパイルできません.ここで「処理」するのは,メソッドにthrows句が宣言する異常やtry−catchブロックにおけるcatch句の異常である.

package demo;

import java.lang.Thread.UncaughtExceptionHandler;

public class ThreadTest
{
    public static void main(String[] args)
    {
        ThreadA a = null;
        try
        {
            ErrHandler handle = new ErrHandler();
            a = new ThreadA();
            a.setUncaughtExceptionHandler(handle);//      ErrHandler
            a.start(); //    run   RuntimeException      
            // a.run();       RuntimeException      
        }
        catch (Exception e)
        {
            System.out.println("catch RunTimeException a"); //     ,  Exception    handle  
        }

        //         try...catch           
        try
        {
            ThreadB b = new ThreadB();
            b.start();
        }
        catch (Exception e)
        {
            System.out.println("catch RunTimeException b"); //     
        }
    }

}

/**
 *       UncaughtExceptionHandler
 */
class ErrHandler implements UncaughtExceptionHandler
{
    /**
     *               ,        
     */
    public void uncaughtException(Thread a, Throwable e)
    {
        System.out.println("This is:" + a.getName() + ",Message:" + e.getMessage());
        e.printStackTrace();
    }
}

/**
 *   UncaughtExceptionHandler   
 */
class ThreadA extends Thread
{
    public ThreadA()
    {
    }

    public void run()
    {
        double i = 12 / 0;//   ArithmeticException RuntimeException   
    }
}

/**
 *     
 */
class ThreadB extends Thread
{
    public ThreadB()
    {
    }

    public void run()
    {
        try
        {
            double i = 12 / 0;//   ArithmeticException RuntimeException   
        }
        catch (RuntimeException e)
        {
            throw e;
        }
    }
}