首页 > 其他分享 >线程池异常处理

线程池异常处理

时间:2023-08-25 14:46:09浏览次数:24  
标签:Thread 处理 int 线程 new threadPoolExecutor 异常 ThreadPoolExecutor

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

方式一 简单粗暴 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;
    }

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

标签:Thread,处理,int,线程,new,threadPoolExecutor,异常,ThreadPoolExecutor
From: https://www.cnblogs.com/lyc88/p/17656858.html

相关文章

  • WPF中窗口控件的跨线程调用
    在多线程里面,UI是不能直接跨线程使用的。在WinForm中,我们要跨线程访问窗口控件,只需要设置属性CheckForIllegalCrossThreadCalls=false;即可。在WPF中要设置Dispatcher属性。msg为要输出的内容privatedelegatevoidoutputDelegate(stringmsg);privatev......
  • java线程池
    Executors创建线程的4种方法//1.newSingleThreadExecutor创建“单线程化线程池”//特点://单线程化的线程池中的任务是按照提交的次序顺序执行的。//只有一个线程的线程池。//池中的唯一线程的存活时间是无限的。//......
  • 软件测试 | 测试对URL长度的处理
    问题你的应用可能无法很好地处理个别POST参数,你也应该检查应用对特别长的URL的处理方式。HTTP标准(RFC2616)中没有限制URL的长度。相反,有可能发生的的情况是你的系统中某些其他方面可能会加以限制。你需要确保以限制的方式是可预测并可接受的。解决方案有几种方案可以测试超长的URL......
  • Python logging.handlers模块,RotatingFileHandler、TimedRotatingFileHandler 处理器
    转自:https://blog.csdn.net/B11050729/article/details/132353220 ......
  • 线程优先级
    线程优先级Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行。线程的优先级用数字表示,范围从1~10.Thread.MIN_PRIORITY=1;Thread.MAX_PRIORITY=10;Thread.NORM_PRIORITY=5;使用以下方式改变或......
  • 并发和并行,线程和进程
     ......
  • 三维模型OBJ格式轻量化压缩处理的数据质量提升方法分析
    三维模型OBJ格式轻量化压缩处理的数据质量提升方法分析 在三维模型的OBJ格式轻量化压缩处理过程中,除了减小文件大小和提高加载速度之外,我们也需要考虑如何提升数据质量。以下是几种常见的方法:1、优化顶点数据:顶点数据是三维模型中最重要的部分,直接影响到模型的形状和细节。在......
  • 初探修模的三维模型OBJ格式轻量化压缩的遇到常见问题与处理方法
    初探修模的三维模型OBJ格式轻量化压缩的遇到常见问题与处理方法 在对经过修模的三维模型进行OBJ格式轻量化压缩处理的过程中,可能会遇到一些常见问题。以下是一些常见问题以及相应的处理方法:1、顶点丢失和形状变形:在减小顶点数量的过程中,可能会导致一些细节部分丢失或者模型整......
  • C++异常处理:try、throw、catch
    ​1.引子程序在运行时,总是会遇到一些错误,这些错误或者是导致程序无法运行,例如操作空指针,或是不符合正常运行的规律,例如除以0。因此,在C++程序当中就必须添加对应异常处理机制,在检测到指定的程序异常时,为保证程序正常运行,需要跳转至异常处理程序当中。常规的错误处理有以下几种解......
  • 状态栏消息处理
    代码实现: classSapMessageType(enum.Enum):SUCCESS="S"WARNING="W"ERROR="E"ABORT="A"INFORMATION="I"classSapStatusMessage:def__init__(self,message_as_popup,messag......