Javaマルチスレッド-トラッピングスレッド異常


メインスレッドがサブスレッドの運転時に異常なRuntimeExceptionを捕捉できません。サブスレッドRuntimeExceptionはinvoke子スレッドのメインスレッドにどのような影響を与えますか?メインスレッドはこの影響を受けず、このRuntimeExceptionは処理されません。しかも、この異常までcatchが使えません。自分のコードを実行し続けます。だからスレッド方法の異常は自分で処理するしかないと結論しました。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ExeceptionThread implements Runnable {
    @Override
    public void run() {
        throw new RuntimeException();
    }

    public static void main(String[] args) {
        try {
            ExecutorService exec = Executors.newCachedThreadPool();
            exec.execute(new ExeceptionThread());
        } catch (Exception e) {
            System.out.println("exeception has handled");
        }
    }
}
出力:
Exception in thread「pool-1-thread-1」java.lang.RuntimeException at Thread. Exectitition.Exectitition.Exectitititititition.Exectitititititititition.Exectitition.Exectitititition.Exectititititition.Exectititititititition.Exectititititititititititionn.Exectititititititititititition.Exectitititititititititititititition.Execon.Exectrtron.Exectrtrtrtron.Exectititititititititilang.Thread.run(Uniknown Source)
解決方法:デフォルトの異常捕獲類を設定することにより異常を捕捉します。
あるthreadにUnicaght Exception Handlerを設定して、このスレッドに異常が発生した時にUnicaugh Extrocption Handlerインターフェースをフィードバックすることによって、Problic void uncagt Exception(Thread t,Throwable)方法で異常を処理できるようにするという利点または目的は、スレッドの境界以外である。捕獲されていない異常を処理できるところがあります。しかし、特に明確にしたいのは、コールバック方法で異常を処理しているにもかかわらず、このコールバック方法は実行中に異常を投げ続けているということです。
import java.lang.Thread.UncaughtExceptionHandler;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ExeceptionThread implements Runnable {
    @Override
    public void run() {
        throw new RuntimeException();
    }

    public static void main(String[] args) {
        try {
            Thread thread = new Thread(new ExeceptionThread());
            //        。    Thread       UncaughtExceptionHandler
            Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {

                @Override
                public void uncaughtException(Thread t, Throwable e) {
                    System.out.println("caught "+e);
                }
            });
            ExecutorService exec = Executors.newCachedThreadPool();
            exec.execute(thread);
        } catch (Exception e) {
            System.out.println("exeception has handled");
        }
    }
}
出力:
cauht java.lang.RuntimeException
ExectorServiceを使用しないなら、直接threadに異常な捕獲類を設定すればいいです。上のコードを少し改造してください。
Thread thread = new Thread(new ExeceptionThread());
//          ExecutorService
thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {

        @Override
        public void uncaughtException(Thread t, Throwable e) {
            System.out.println("caught "+e);
        }
    });

thread.start();
出力:
cauht java.lang.RuntimeException
スレッド設計のコンセプト:「スレッドの問題は自分自身で解決すべきで、外部に委託しないでください。」