線程入門——捕獲異常

示例:java

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;

/**
 * Created by Administrator on 2017/9/6.
 */

//任務
class ExceptionThread2 implements Runnable {
    @Override
    public void run() {
        Thread t = Thread.currentThread();
        System.out.println("run() by" + t);
        System.out.println(
                "eh = " + t.getUncaughtExceptionHandler()
        );
        throw new RuntimeException();
    }
}

//異常處理
class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.print("caught" + e);
    }
}

//以線程方式啓動任務
class HandlerThreadFactor implements ThreadFactory {
    public Thread newThread(Runnable r) {
        System.out.println(this + " creating new Thread");
        Thread t = new Thread(r);
        System.out.println("created " + t);
        t.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
        System.out.println(
                "eh = " + t.getUncaughtExceptionHandler()
        );
        return t;

    }
}


public class CaptureUncaughtException {
    public static void main(String[] args){
        ExecutorService exec = Executors.newCachedThreadPool(new HandlerThreadFactor());
        exec.execute(new ExceptionThread2());
    }

}

輸出結果:ide

因爲線程的本質特性,使得你不能捕獲從線程中逃逸的異常。一旦異常逃出任務的run()方法以外,它就會向外傳播到控制檯,除非你採起特殊的步驟捕獲這些錯誤的異常。能夠用Executor來解決這個問題。this

Thread.UncaughtException-Handler是Java SE中的新接口,它容許你在每一個Thread對象上都附着一個異常處理器,Thread.UncaughtExceptionHandler.uncaughtException()會在線程因未捕獲的異常而臨近死亡時被調用,爲了使用它,創新了一個新類型的ThreadFactory,它將在每一個新建立的Thread對象上附着一個Thread.UncaughtExceptionHandler。將這個工廠傳遞給Executors建立新的ExecutorService的方法。線程

相關文章
相關標籤/搜索