ThreadPoolExecutor获取原始异常

ThreadPoolExecutor作用

ThreadPoolTaskExecutor是Spring框架提供的一个线程池实现,它是基于Java的ThreadPoolExecutor实现的。ThreadPoolTaskExecutor可以管理线程池中的线程,以满足多线程并发执行任务的需要。

FutureTask作用

FutureTask的主要作用是在多线程环境下,获取异步执行的结果。在执行该任务时,可以通过Future接口的get()方法来获取任务的执行结果,而不必串行阻塞等待。由此,FutureTask可以通过异步的方式充分利用服务器资源,提高代码的执行效率与响应速度。

get方法可能会阻塞当前线程,如果任务还没有执行完成,会一直等待,直到任务执行完成后返回结果。如果不想等待任务执行完成,可以使用isDone方法判断任务是否已经执行完成。

ThreadPoolTaskExecutor配合Future使用

import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;

public class ThreadPoolTaskExecutorWithFutureExample {
    public static void main(String[] args) throws Exception {
        //配置ThreadPoolTaskExecutor
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(50);
        executor.setThreadNamePrefix("MyThreadPool-");
        executor.initialize();

        MyTask task = new MyTask();
        //使用executor.submit()方法提交任务到线程池中执行,并得到Future对象。
        Future<Integer> future = executor.submit(task);
				//在需要的时候调用future.get()方法获取任务的执行结果,如果任务还没有执行完成,该方法将阻塞当前线程直到任务执行完成。
        int result = future.get();
        System.out.println("Result: " + result);

        executor.shutdown();
    }

  	/**
     * //创建一个实现Callable接口的任务类,该类封装了要执行的任务,并返回结果。
     */
    static class MyTask implements Callable<Integer> {
        @Override
        public Integer call() throws Exception {
            return 1 + 1;
        }
    }
}

ThreadPoolTaskExecutor异常处理

下面是一段会出现异常的代码:

public class ThreadPoolTaskExecutorWithFutureExample {
    public static void main(String[] args) {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        try {
            //配置ThreadPoolTaskExecutor
            executor.setCorePoolSize(5);
            executor.setMaxPoolSize(10);
            executor.setQueueCapacity(50);
            executor.setThreadNamePrefix("MyThreadPool-");
            executor.initialize();

            MyTask task = new MyTask();
            Future<Integer> future = executor.submit(task);

            int result = future.get();
            System.out.println("Result: " + result);

            executor.shutdown();
        } catch (Exception e) {
            System.out.println(e.getCause().getMessage());
        }
    }

    /**
     * //创建一个实现Callable接口的任务类,该类封装了要执行的任务,并返回结果。
     */
    static class MyTask implements Callable<Integer> {
        @Override
        public Integer call() {
            //抛出异常
            int i = 1 / 0;
            return 1 + 1;
        }
    }
}

异常日志:

在这里插入图片描述

可以看到,控制台只是以info级别日志打印了以上异常信息。那么异常信息将会在info日志文件中记录。这样不利于错误排查,显然不符合生产环境要求!

解决方案

一:重写ThreadPoolExecutorAfterExecute
public class ThreadPoolExecutorAfterExecuteExample {
    public static void main(String[] args) {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>()) {
            @Override
            protected void afterExecute(Runnable r, Throwable t) {
                super.afterExecute(r, t);
                if (t == null) {
                    System.out.println("Task " + r.toString() + " completed successfully");
                } else {
                    System.out.println("Task " + r.toString() + " failed with exception: " + t.getMessage());
                }
            }
        };

        executor.execute(() -> {
            System.out.println("Task 1");
            throw new RuntimeException("Task 1 failed");
        });

        executor.execute(() -> {
            System.out.println("Task 2");
        });

        executor.execute(() -> {
            System.out.println("Task 3");
            throw new RuntimeException("Task 3 failed");
        });

        executor.shutdown();
    }
}

在这里插入图片描述

二:手动抛出新的异常
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    try {
        //配置ThreadPoolTaskExecutor
        executor.setCorePoolSize(5);
				//配置代码

        int result = future.get();
        System.out.println("Result: " + result);
        executor.shutdown();
    } catch (Exception e) {
        System.out.println(e.getCause().getMessage());
        //手动创建抛出异常
        throw new RuntimeException(e);
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/9366.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringAMQP

SpringAMQP3.SpringAMQP3.1.Basic Queue 简单队列模型3.1.1.消息发送3.1.2.消息接收3.1.3.测试3.2.WorkQueue3.2.1.消息发送3.2.2.消息接收3.2.3.测试3.2.4.能者多劳3.2.5.总结3.3.发布/订阅3.4.Fanout3.4.1.声明队列和交换机3.4.2.消息发送3.4.3.消息接收3.4.4.总结3.5.Direct…

docker

1.docker安装 1.安装docker 2.配置docker加速器 3.docker的基本目录 /etc/docker/ docker的认证目录 /var/lib/docker/ docker的应用目录 2.docker容器 docker image pull nginx docker container stop nginx docker container rm $(docker container ps -aq) #q: --quiet …

代码随想录-62-530. 二叉搜索树的最小绝对差

目录前言题目1.二叉搜索树中序遍历特性介绍&#xff08;并且使用一个指针始终指向前一个&#xff09;全局变量2. 本题思路分析&#xff1a;&#xff08;中序遍历&#xff09;3. 算法实现4. 算法坑点前言 我在刷卡哥的“代码随想录”&#xff0c;自己的总结笔记均会放在“算法刷…

OpenCV基础之边缘检测与轮廓描绘

文章目录OpenCv基础之边缘检测与轮廓描绘Canny边缘检测图像轮廓绘制轮廓OpenCv基础之边缘检测与轮廓描绘 边缘检测&#xff1a;主要是通过一些手段检测数字图像中明暗变化剧烈&#xff08;即梯度变化比较大&#xff09;像素点&#xff0c;偏向于图像中像素点的变化。 轮廓检测…

CAN-FD协议

总目录链接>> AutoSAR入门和实战系列总目录 总目录链接>> AutoSAR BSW高阶配置系列总目录 文章目录CAN-FD协议**CAN-FD协议需要什么&#xff1f;**CAN-FD 协议的属性CAN-FD 协议中的安全性OSI 层中的 CAN-FD**CAN-FD物理层设计**CAN-FD 数据链路层数据链路层的…

win10自带的输入法变成了繁体怎么改回来

win x 键弹出设置窗口 选择设置 点击时间和语言 点击语言 点击中文(中国人民共和国) 先点击一下会出来选项 在点击选项进去 往下拉最底下找到 键盘下面你正在使用的输入法 点击他 选择选项进去&#xff0c;然后点击常规 在 选择字符集这里下面 选择简体中文

SpringBoot中配置文件加密及跨域支持

给application.properties文件中的某些值加密,比如数据库账号密码等. 引入依赖 <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.3</version> </dep…

Properties

Properties概述&#xff1a; 是一个Map体系的集合类 Properties可以保存到流中或从流中加载 练习&#xff1a;Properties作为Map集合的使用 package com.aynu13;//练习&#xff1a;Properties作为Map集合的使用import java.util.Properties; import java.util.Set;public cla…

交友项目【手机号登录注册功能】实现

目录 1&#xff1a;用户登录 1.1&#xff1a;接口文档 1.2&#xff1a;API接口定义 1.3&#xff1a;Dubbo服务提供者 配置文件 启动引导类 数据访问层 API接口实现 1.4&#xff1a;Dubbo服务消费者 UserController UserService 1.5&#xff1a;访问测试 1.6&#…

【Django 网页Web开发】23. 实战项目:Excel和form和moudleForm的文件上传(16)(保姆级图文)

目录excel文件批量上传数据1. depart_list.html2. url.py3. moudle.py4. depart.py5. upload.pyform文件上传1. upload_form.html2. url.py3. moudle.py4. upload.py5. 目录media存放用户上传的文件总结欢迎关注 『Django 网页Web开发』 系列&#xff0c;持续更新中 欢迎关注 『…

PHY- PHY芯片概述

1 PHY概述 关于Internet Protocal的分层模型可以参考文章 :【Internet Protocal-OSI模型中的网络分层模型】,下面我们讲讲底层以太网控制器和收发器的知识。其主要是处理OSI模型中的物理层和链路层的事情。 在CAN/CANFD、FlexRay等总线中,有控制器Controller和收发器Transc…

【华为OD机试】1024 - 素数伴侣

文章目录一、题目&#x1f538;题目描述&#x1f538;输入输出&#x1f538;样例1&#x1f538;样例2二、思路解析三、代码参考作者&#xff1a;KJ.JK&#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &…

Ae:灯光选项

灯光选项 Light Options&#xff0c;用于调整光源的特性以及所产生的投影的相关设置。下面以属性最多的聚光灯的灯光选项为例进行说明。强度 Intensity光源的亮度。数值越大&#xff0c;光照越大。负值可产生吸光效果&#xff0c;即降低场景中其它光源的光照强度。颜色 Color默…

Java客户端操作索引库

ElasticSearch第二天 学习目标&#xff1a; 能够使用java客户端完成创建、删除索引的操作能够使用java客户端完成文档的增删改的操作能够使用java客户端完成文档的查询操作能够完成文档的分页操作能够完成文档的高亮查询操作能够搭建Spring Data ElasticSearch的环境能够完成…

C++中的类模版

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C &#x1f525;座右铭&#xff1a;“不要等到什么都没有了&#xff0c;才下…

银行数字化转型导师坚鹏:金融科技与银行转型

金融科技与银行转型课程背景&#xff1a; 数字化背景下&#xff0c;很多银行存在以下问题&#xff1a; 不清楚5G如何赋能银行数字化转型&#xff1f; 不清楚金融科技如何赋能银行数字化转型&#xff1f; 不了解银行数字化转型标杆成功案例&#xff1f; 课程特色&#xff1a;…

Python 进阶指南(编程轻松进阶):十七、Python 风格 OOP:属性和魔术方法

原文&#xff1a;http://inventwithpython.com/beyond/chapter17.html 很多语言都有 OOP 特性&#xff0c;但是 Python 有一些独特的 OOP 特性&#xff0c;包括属性和魔术方法。学习如何使用这些 Python 风格技巧可以帮助您编写简洁易读的代码。 属性允许您在每次读取、修改或…

Leetcode.993 二叉树的堂兄弟节点

题目链接 Leetcode.993 二叉树的堂兄弟节点 Rating &#xff1a; 1288 题目描述 在二叉树中&#xff0c;根节点位于深度 0 处&#xff0c;每个深度为 k 的节点的子节点位于深度 k1 处。 如果二叉树的两个节点深度相同&#xff0c;但 父节点不同 &#xff0c;则它们是一对堂兄…

Java IO相关

1、深拷贝和浅拷贝的区别是什么? 浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象 深拷贝:被复制对象的所有变量都含有与原来的对象相同的值.而那些引用其…

生成式AI已形成全球性“AI再造业务”趋势

3月28日至31日&#xff0c;博鳌亚洲论坛2023年年会在海南举行。实体经济与数字经济如何融合发展&#xff0c;产业数字化如何加速向深层次拓展&#xff0c;生成式AI会给产业经济带来哪些变革&#xff1f;这些话题成为今年论坛热点。 百度集团执行副总裁、百度智能云事业群总裁沈…