解析Java线程池的异常处理机制

感谢:1、滑动验证页面

2、线程的异常捕获与线程池的异常捕获 execute与submit区别:线程的异常捕获与线程池的异常捕获 execute与submit区别_threadutil.execute-CSDN博客

原文:https://www.cnblogs.com/wscit/p/6100476.html

3、线程吞掉异常信息 - 简书

  1. 直接try/catch

@Test    public void catchThreadPoolTest() {
        ExecutorService threadPool = Executors.newFixedThreadPool(1);
        try {
            Runnable runnable = () -> {                System.out.println("-----------submit---------------");                Object obj = null;                System.out.println(obj.toString());
            };
            threadPool.submit(runnable).get();
        } catch (Exception e) {            System.out.println("---------submit  Exception---------");
            e.printStackTrace();
        }        System.out.println("-----------华丽的分割线---------------");
        threadPool.execute(() -> {
            try {                Object obj = null;                System.out.println(obj.toString());
            } catch (Exception e) {                System.out.println("---------execute  Exception-----------");
                e.printStackTrace();
            }
        });
    }

2、线程直接重写整个方法:
第一段代码仅限于execute方法,因为submit的异常在线程池定义那块捕获不到,只有get的时候才会抛出,并且影响主线程的进行

@Test
    public void threadPoolTest() {
        ExecutorService threadPool = Executors.newFixedThreadPool(1, r -> {
            Thread t = new Thread(r);
            t.setUncaughtExceptionHandler(                    (t1, e) -> System.out.println(t1 + " throws exception: " + e));            return t;
        });
        threadPool.execute(() -> {
            System.out.println("-----------execute---------------");            Object obj = null;
            System.out.println(obj.toString());
            System.out.println("-----------obj.toString---------------");
        });        System.out.println("-----------afterExecue---------------");
    }
@Test    public void catchedExecutor() {
        ExecutorService executorService = Executors.newCachedThreadPool(new MyThreadFactory());
        executorService.execute(new Task());
        executorService.shutdownNow();
        System.out.println("-----------start---------------");
    }public class MyThreadFactory implements ThreadFactory {    public Thread newThread(Runnable r) {
        Thread t = new Thread(r);
        t.setUncaughtExceptionHandler(new RewriteUncatchtExceptionHandler());
        System.out.println("Thread[" + t.getName() + "] created.");        return t;
    }
}public class Task implements Runnable {    public void run() {
        System.out.println("执行任务");
        int num  = Integer.parseInt("TT");
    }
}public class RewriteUncatchtExceptionHandler implements Thread.UncaughtExceptionHandler {    public void uncaughtException(Thread t, Throwable e) {
        System.out.println("我捕获到了线程池的异常");
    }
}
@Test    public void rewriteUncaughtException() {        Task task = new Task();
        Thread thread = new Thread(task);
        thread.setUncaughtExceptionHandler(new RewriteUncatchtExceptionHandler());
        thread.start();
        System.out.println("-----------start---------------");
    }public class RewriteUncatchtExceptionHandler implements Thread.UncaughtExceptionHandler{    public void uncaughtException(Thread t, Throwable e) {
        System.out.println("我捕获到了线程池的异常");
    }
}public class Task implements Runnable {    public void run() {
        System.out.println("执行任务");        int num  = Integer.parseInt("TT");
    }
}
@Test
    public void rewriteAfterExecute() {
        ExecutorService threadPool2 = new MyThreadPoolExecutor(1, 1, 1000, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10));
        threadPool2.execute(() -> {
            System.out.println("-----------execute---------------");            Object obj = null;
            System.out.println(obj.toString());
        });        System.out.println("-----------afterExecue---------------");
    }public class MyThreadPoolExecutor extends ThreadPoolExecutor {    public MyThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
    }    protected void afterExecute(Runnable r, Throwable t) {        if(t!=null){            System.out.println("MyThreadPoolExecutor     "+t);
        }
    }
}

1.

Thread t = new Thread();
       t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
public void uncaughtException(Thread t, Throwable e) {
LOGGER.error(t + " throws exception: " + e);
}
        });        //如果是线程池的模式:
        ExecutorService threadPool = Executors.newFixedThreadPool(1, r -> { Thread t = new Thread(r);
 t.setUncaughtExceptionHandler(
  (t1, e) -> LOGGER.error(t1 + " throws exception: " + e)); return t;
        });


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容