@Async注解线程池

2023-10-31

在启动类上添加@EnableAsync配合该注解使用
自定义线程池方法:

  1. implements AsyncConfigurer
  2. extends AsyncSupportConfigurer
  3. Bean 注入线程池
public interface AsyncConfigurer {
    @Nullable
    default Executor getAsyncExecutor() {
        return null;
    }

    @Nullable
    default AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return null;
    }
}
public class AsyncConfigurerSupport implements AsyncConfigurer {
    public AsyncConfigurerSupport() {
    }

    public Executor getAsyncExecutor() {
        return null;
    }

    @Nullable
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return null;
    }
}

都是在getAsyncExecutor方法种得到自定义线程池,不过还是得将线程池托管给bean,以便于spring可以管理线程池对象的生命周期。
第三种就是注入线程池bean:

    @Bean
    public ThreadPoolTaskExecutor executor() {
        ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        threadPoolTaskExecutor.setThreadNamePrefix("Async-pool-");
        threadPoolTaskExecutor.initialize();
        return threadPoolTaskExecutor;
    }

如果bean不指定名字,将先从容器中检索Executor的bean,再找叫taskExecutor的bean,如果都没有找到则new一个SimpleAsyncTaskExecutor

SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,默认每次调用都会创建一个新的线程。

SyncTaskExecutor:这个类没有实现异步调用,只是一个同步操作。只适用于不需要多线程的地方。

ConcurrentTaskExecutorExecutor的适配类,不推荐使用。如果ThreadPoolTaskExecutor不满足要求时,才用考虑使用这个类。

SimpleThreadPoolTaskExecutor:是QuartzSimpleThreadPool的类。线程池同时被quartz和非quartz使用,才需要使用此类。

ThreadPoolTaskExecutor :最常使用,推荐。其实质是对java.util.concurrent.ThreadPoolExecutor的包装。

org.springframework.aop.interceptor.AsyncExecutionAspectSupport:

    @Nullable
    protected Executor getDefaultExecutor(@Nullable BeanFactory beanFactory) {
        if (beanFactory != null) {
            try {
                return (Executor)beanFactory.getBean(TaskExecutor.class);
            } catch (NoUniqueBeanDefinitionException var6) {
                this.logger.debug("Could not find unique TaskExecutor bean. Continuing search for an Executor bean named 'taskExecutor'", var6);

                try {
                    return (Executor)beanFactory.getBean("taskExecutor", Executor.class);
                } catch (NoSuchBeanDefinitionException var4) {
                    if (this.logger.isInfoEnabled()) {
                        this.logger.info("More than one TaskExecutor bean found within the context, and none is named 'taskExecutor'. Mark one of them as primary or name it 'taskExecutor' (possibly as an alias) in order to use it for async processing: " + var6.getBeanNamesFound());
                    }
                }
            } catch (NoSuchBeanDefinitionException var7) {
                this.logger.debug("Could not find default TaskExecutor bean. Continuing search for an Executor bean named 'taskExecutor'", var7);

                try {
                    return (Executor)beanFactory.getBean("taskExecutor", Executor.class);
                } catch (NoSuchBeanDefinitionException var5) {
                    this.logger.info("No task executor bean found for async processing: no bean of type TaskExecutor and no bean named 'taskExecutor' either");
                }
            }
        }

        return null;
    }

org.springframework.aop.interceptor.AsyncExecutionInterceptor:

    @Nullable
    protected Executor getDefaultExecutor(@Nullable BeanFactory beanFactory) {
    // 先调用父类方法搜索bean 没有则new一个
        Executor defaultExecutor = super.getDefaultExecutor(beanFactory);
        return (Executor)(defaultExecutor != null ? defaultExecutor : new SimpleAsyncTaskExecutor());
    }

如果我们在定义线程池的时候没有给bean取名字,会去找一个taskExecutor的bean,可以使用
@Bean(AsyncExecutionAspectSupport.DEFAULT_TASK_EXECUTOR_BEAN_NAME)指定名称,这样在@Async中不用指定线程池的名字

org.springframework.aop.interceptor.AsyncExecutionAspectSupport:

    public static final String DEFAULT_TASK_EXECUTOR_BEAN_NAME = "taskExecutor";

线程池不指定名字的时候,有可能会出现bean容器中有多个线程池bean,然而@Async不知道要去用哪个,从而引发异常,业务失效。
所以最好是指定名称:

    @Bean("asyncExecutor1")
    public ThreadPoolTaskExecutor executor() {
        ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        threadPoolTaskExecutor.setThreadNamePrefix("Async-pool-");
        threadPoolTaskExecutor.initialize();
        return threadPoolTaskExecutor;
    }
    @Bean("asyncExecutor2")
    public ThreadPoolTaskExecutor executor() {
        ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        threadPoolTaskExecutor.setThreadNamePrefix("Async-pool2-");
        threadPoolTaskExecutor.initialize();
        return threadPoolTaskExecutor;
    }
@Async("asyncExecutor1")
public void speakNameByAsync(String name) {

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

@Async注解线程池 的相关文章

随机推荐

  • 夯实网络安全基石,筑牢网络安全防线

    没有网络安全就没有国家安全 这句话我们常常能在各种新闻里看见 安全是发展的前提 发展是安全的保障 共同推进安全和发展 Z强调 要坚持依法治网 依法办网 依法上网 今年的国家网络安全宣传周在9月11日至17日全国范围内开展 今年的网安周以 网
  • 电脑重装系统后需要更新哪些驱动

    在电脑重装系统后 由于系统的重置 您需要重新安装和更新一些关键的驱动程序 以确保硬件设备正常工作和性能最佳化 以下是在电脑重装系统后需要更新的一些常见驱动程序 工具 原料 系统版本 win10系统 品牌型号 戴尔 XPS13 9350 37
  • H5新增标签 css图标库 web 前端 字体 问题

    目录 css图标库 web前端字体 CSS Hint H5新增标签 1
  • OpenCV学习(2)——图像的数据格式BGR

    OpenCV学习 2 图像的BGR格式解读 1 opencv读取的图片数据格式 2 BGR含义 1 opencv读取的图片数据格式 opencv读取的图片数据格式为numpy的nparray格式 一张二维图片是由像素点构成 如下图所示 其中
  • Mysql:增删改查基础语句

    mysql基础入门语句 增 INSERT INTO 表名 字段1 2 3 VALUES 值1 2 3 删 DELETE FROM 表明 WHERE 删除条件 不提供更新条件 则删除所有 改 UPDATE 表名 SET 字段1 新值 字段2
  • JavaScript学习 -- ajax方法的POST请求

    在Web开发中 通过POST请求将数据发送给服务器是一种常见的方式 使用jQuery可以轻松地发送POST请求 这需要使用jQuery的ajax 方法 本文将介绍jQuery如何使用POST请求发送数据 并提供一个实际的例子 使用 ajax
  • rcp命令

    http www cnblogs com peida archive 2013 03 14 2958685 html rcp代表 remote file copy 远程文件拷贝 该命令用于在计算机之间拷贝文件 rcp命令有两种格式 第一种格
  • Py_Finalize引发的异常

    Py Finalize引发如下异常 0x00007FFFE5A28D10 python38 dll 处 位于 MTFform exe 中 引发的异常 0xC0000005 执行位置 0x00007FFFE5A28D10 时发生访问冲突 解决
  • 项目系列之登录管理

    登录管理是现代计算机系统中关键的组成部分之一 那么本篇博客我们来简单了解一下登录的流程与前后端干了啥事 一 登录流程 用户打开登录页面 用户访问应用程序或网站的登录页面 此页面通常包含用户名 邮箱输入字段和密码输入字段 以及登录按钮 用户输
  • 2、模板方法

    文章目录 概念 demo 概念 父类定义抽象 的 template method 并由别的方法调用 子类实现具体的 template method 和观察者类似 回调函数 钩子函数 都是此模式的应用 观察者一般是多个 方法由被观察者调用 模
  • redhat6.4 下安装oracle 11g详细完整的步骤

    一 虚拟机安装操作系统 Redhat 6 4 注意 linux下安装oracle 11 如果是redhat系统 选择redhat6版本的 因为redhat7版本里面少一个安装数据库用到的包compat libstdc 33 没有这个包 安装
  • flutter自定义广告Banner

    Flutter 1 0 is out Tuesday December 4 2018 Banner是手机应用最常见的需求之一 https pub dartlang org flutter中搜索Banner找到两个开源库 引入项目后 分别存在
  • 项目应用:使用自定义注解完成对controller的aop控制

    在项目进行过程中 需要使用aop对api传入或者传出数据进行日志记录 考虑实际应用 放弃了使用拦截器 转而使用aop的前置通知和返回通知中加入日志记录操作 在spring中 controller会被JDK自动代理 当使用自定义标签时cont
  • R语言的基本数据类型:数值,字符串,逻辑

    R语言的基本数据类型 数值 双整型 储存普通数值型数据 可正可负 可大可小 可含小数可不含 R中输入的任何一个数值都默认以双整型存储 可以使用typeof 函数来查看对象类型 在数据科学里 它更常被称为数值型 整型 只能用来储存正数 在R中
  • 前端面试题之——兼容篇

    兼容性面试题 一 html 部分 1 H5 新标签在 IE9 以下的浏览器识别 html5shiv js 下载地址 2 ul 标签内外边距问题 ul 标签在 IE6 IE7 中 有个默认的外边距 但是在 IE8 以上及其他浏览器中 有个默认
  • websphere6.x 调用集群EJB的Context.PROVIDER_URL写法

    import java util Hashtable import javax naming Context import javax naming InitialContext Hashtable env new Hashtable en
  • caffe源码解析 — net.cpp

    Net类是Solve类的一个成员 在net cpp中定义了对Net的所有操作 其中包括 Init GetLearningRateAndWeightDecay ForwardPrefilled Backward ShareTrainedLay
  • 计算机数值转换教案,计算机数值方法教案.doc

    第O章 绪论 一 教学设计 1 教学内容 数值计算方法这门课程的形成背景及主要研究内容 研究方法 主要特点 算法的有关概念及要求 误差的来源 意义 及其有关概念 数值计算中应注意的一些问题 2 重点难点 算法设计及其表达法 误差的基本概念
  • 数据结构——快速排序

    1 原理及代码实现 快速排序 快速排序也是一种分治的排序算法 快速排序和归并排序是互补的 归并排序将数组分成两个子数组分别排序 并将有序的子数组归并以将整个数组排序 会需要一个额外的数组 而快速排序的排序方式是当两个子数组都有序时 整个数组
  • @Async注解线程池

    在启动类上添加 EnableAsync配合该注解使用 自定义线程池方法 implements AsyncConfigurer extends AsyncSupportConfigurer Bean 注入线程池 public interfac