美文网首页
线程池异常处理

线程池异常处理

作者: 川流不息attitude | 来源:发表于2023-08-24 14:32 被阅读0次

背景:有时候我们把一些业务逻辑丢在线程池处理,本身的业务方法又没有打印日志,导致这个方法执行过程中是否出错了根本不知道,异常信息基本丢失,问题不好排除。

方式一 简单粗暴 try catch 执行的方法
 @Test
    public void testThreadException(){
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5,5,2,
                TimeUnit.SECONDS,new LinkedBlockingDeque<>(20)
                ,new ThreadPoolExecutor.CallerRunsPolicy());

        for (int i = 0;i < 5;i++){
            int finalI = i;
            threadPoolExecutor.execute(()-> log.info("{}",test(finalI)));
        }
        threadPoolExecutor.shutdown();
    }

    public int test(int i){
        try {
            return 2/i;
        }catch (Exception e){
            log.error("线程{}出错了",Thread.currentThread().getName(),e);
            return i;
        }
    }
}
方式二 重写一下 线程工厂中给线程设置uncaughtExceptionHandler
@Test
    public void testThreadException(){
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5,5,2,
                TimeUnit.SECONDS,new LinkedBlockingDeque<>(20),
                threadFactory -> {
                    Thread t = new Thread(threadFactory);
                    // 获取线程池中的异常
                    t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
                        @Override
                        public void uncaughtException(Thread t, Throwable e) {
                            // 对异常进行处理
                            log.error("线程{}出错了",t.getName(),e);
                        }
                    });
                    return t;
                }
                ,new ThreadPoolExecutor.CallerRunsPolicy());

        for (int i = 0;i < 5;i++){
            int finalI = i;
            threadPoolExecutor.execute(()-> log.info("{}",test(finalI)));
        }
        threadPoolExecutor.shutdown();
    }

    public int test(int i){
        return 2/i;
    }

总结:方式二 更加好,可以统一定义好,这样项目里面都用公用的线程池, 可以防止有些方法 异常日志丢失了 造成排错困难。

相关文章

  • python3 线程池和异常处理

    引用 线程池的基本使用as_completedwaitmap 线程池的异常处理 进程池用法 引用 Python中已...

  • 线程池异常处理

    一个栗子 模拟线程池中任务在执行过程中发生异常。 这段代码在执行中,肯定会报一个除0异常,但是我们不会收到任何错误...

  • Java线程池异常处理

    起因 在Java默认的线程池中执行的程序,如果程序产生异常导致线程池里面的线程死掉,完全没有任何信息抛出来,这个是...

  • 线程池终探

    线程池四种拒绝策略 AbortPolicy 直接抛异常 DiscardPolicy 丢弃不处理 DiscardO...

  • 线程池使用实例

    自己定义了异常处理类,可以用于记录问题日志。 线程池流程图

  • Java线程池异常处理方案

    执行多线程并发任务的时候,如果任务类型相同,一般会考虑使用线程池,一方面利用了并发的优势,一方面避免创建大量线程得...

  • 一篇文章搞懂线程池

    线程池 什么使用使用线程池? 单个任务处理时间比较短 需要处理的任务数量很大 线程池优势 重用存在的线程,减少线程...

  • 08 线程池

    1 线程池概述 1.1 什么是线程池 线程池就是提前创建若干个线程,如果有任务需要处理,线程池里的线程就会处理任务...

  • java----线程池

    什么是线程池 为什么要使用线程池 线程池的处理逻辑 如何使用线程池 如何合理配置线程池的大小 结语 什么是线程池 ...

  • 线程池并发相关

    1.线程池大小设置 2.线程池执行过程中遇到异常会发生什么,怎样处理? 3.JUC 常用 4 大并发工具类 4.关...

网友评论

      本文标题:线程池异常处理

      本文链接:https://www.haomeiwen.com/subject/pjnmmdtx.html