Javaスレッド学習ノート(両)スレッド異常処理

2408 ワード

スレッドキャプチャ例外:
場合、main()メソッドでは、次のコードのようなスレッドの異常をキャプチャできません.
public class ExceptionThread implements Runnable{
    @Override
    public void run() {
        throw new NullPointerException();
    }

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        try {
            System.out.println(" ");
            executorService.execute(new ExceptionThread());
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(" ");
        }
    }
}

上記のコードはmainメソッドでスレッド異常をキャプチャすることはできませんが、スレッドの異常情報をキャプチャするにはどうすればいいのでしょうか.
次はこのコードを見てみましょう
/**
 *  
 */
class MyExceptionThread implements Thread.UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        //  
        System.out.println(" ");
        System.out.println(e);
    }
}

/**
 *  
 */
class ExceptionThreadFactory implements ThreadFactory {
    @Override
    public Thread newThread(Runnable r) {
        Thread thread = new Thread(r);
        //  。
        thread.setUncaughtExceptionHandler(new MyExceptionThread());
        return thread;
    }
}

/**
 *  
 */
class ExceptionThread2 implements Runnable{
    @Override
    public void run() {
        try {
            Thread.sleep(1000l);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //  
        throw new NullPointerException();
    }

    public static void main(String[] args) {
        //  ExceptionThreadFactory , 
        ExecutorService executorService = Executors.newCachedThreadPool(new ExceptionThreadFactory());
        try {
            System.out.println(" ");
            //  
            executorService.execute(new ExceptionThread2());
            executorService.execute(new ExceptionThread2());
            executorService.execute(new ExceptionThread2());
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(" ");
        }
    }
}

上の出力結果は
 
 
java.lang.NullPointerException
 
java.lang.NullPointerException
 
java.lang.NullPointerException

結論はmain()この方法は依然として異常なスレッドを捉えていないが,もちろん,この設定は合理的である.今、各スレッドには独自の異常処理メカニズムがあります.どうすればいいですか.文、スレッドを作成するとき、その文はいいです.
仕事を終える.