当前位置:首页 > 技术分析 > 正文内容

正确使用@Async,避免踩坑_@async注意事项

ruisui884个月前 (02-14)技术分析17

用法和介绍

功能描述

@Async是Spring提供的使方法异步的注解

使用方法

  1. SpringBoot项目启动类增加@EnableAsync注解,开启异步功能
  2. 给需要异步的方法增加@Async("")注解,一定要指定线程池名称

代码示例

@EnableAsync
@SpringBootApplication
public class StartApplication {
    public static void main(String[] args) {
        SpringApplication.run(StartApplication.class, args);
    }
}
@Service
public class AsyncService {
    /**
     * 使用默认线程池
     */
    @Async
    public void say(){ }
    
    /**
     * 指定线程池名称
     */
    @Async("getAsyncExecutor")
    public void eat(){ }
}
@Configuration
public class MyAsyncConfiguration {
    //核心线程数
	  private static final int CORE_POOL_SIZE = 5;
	  //最大线程数
	  private static final int MAX_POOL_SIZE = 15;
	  //队列大小
	  private static final int QUEUE_CAPACITY = 100;
	  //线程池中的线程的名称前缀
	  private static final String THREAD_NAME = "MyThread-";

	  @Bean
	  public Executor getAsyncExecutor() {
		    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
		    //配置核心线程数
		    executor.setCorePoolSize(CORE_POOL_SIZE);
		    //配置最大线程数
		    executor.setMaxPoolSize(MAX_POOL_SIZE);
		    //配置队列大小
		    executor.setQueueCapacity(QUEUE_CAPACITY);
		    //配置线程池中的线程的名称前缀
		    executor.setThreadNamePrefix(THREAD_NAME);
		    //配置线程池拒绝策略,设置为CallerRunsPolicy,当线程和队列都满了,由发起线程的主线程自己执行
		    executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
		    executor.initialize();
		    return executor;
	  }
}

已实现的TaskExecutor线程池

  • SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,每次调用都会创建一个新的线程。
  • SyncTaskExecutor:这个类没有实现异步调用,只是一个同步操作,只适用于不需要多线程的地方。
  • ConcurrentTaskExecutor:Executor的适配类,不推荐使用。如果ThreadPoolTaskExecutor不满足要求时,才用考虑使用这个类 。
  • SimpleThreadPoolTaskExecutor:是Quartz的SimpleThreadPool的类。线程池同时被quartz和非quartz使用,才需要使用此类。
  • ThreadPoolTaskExecutor :最常使用,推荐。 其实质是对java.util.concurrent.ThreadPoolExecutor的包装。


为什么说一定要指定线程池名称

@Async依赖线程池,当我们未指定线程池@Async会如何选择呢?

1. 当系统未配置任何线程池时

SpringBoot会默认添加一个coreSize=8的 ThreadPoolTaskExecutor 无界线程池,名称applicationTaskExecutor。

2. 当只配置了一个TaskExecutor线程池时

使用此线程池

3. 当只配置了一个线程池,但不是TaskExecutor线程池时

使用 SimpleAsyncTaskExecutor 线和池

4. 当有多个TaskExecutor线程池时

默认使用 SimpleAsyncTaskExecutor 线程池,如果指定就使用指定的线程池(即使不是TaskExecutor类型的线程池也可以)

注意:SimpleAsyncTaskExecutor 不是真的线程池,这个类不重用线程,每次调用都会创建一个新的线程。强烈建议开发时指定线程池的名称,避免创建多个TaskExecutor实例后,使用 SimpleAsyncTaskExecutor 线和池的情况发生

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/1939.html

标签: aysnc
分享给朋友:

“正确使用@Async,避免踩坑_@async注意事项” 的相关文章

体检刷卡收费管理系统

体检刷卡收费管理系统headerfooter《体检刷卡收费管理系统》是针对各医院进行体检刷卡收费管理的一套系统。软件集办卡、充值、刷卡消费、体检登记与一体。主要功能:1.基本信息:科室设置、套餐设置、单项设置、本院信息;2.体检卡管理:单位人员办卡、个人办卡、体检卡充值、体检卡禁用、体检卡开通、体检...

2024年10 大 Linux 桌面发行版推荐

年已过半,现在是探究 2024 年最流行的 Linux 发行版的最佳时机。Linux 是一个开源操作系统,构建在 Linux 内核上,并集成了 GNU shell 实用程序、桌面环境、应用程序、包管理系统。由于其通用性、安全性、用户友好性和多样性,它的受欢迎程度超过了其他操作系统。在本文中,我们将从...

Beta版Linux Mint“Xia”发行版22.1发布

IT之家 12 月 13 日消息,Beta 版 Linux Mint“Xia” 22.1 昨日(12 月 12 日)发布,新版本基于 Ubuntu 24.04,内核版本为 Linux 6.8,长期支持将持续到 2029 年,为用户提供可靠稳定的使用体验。新版本在软件包管理方面,主要弃用了传统的 ap...

12种JavaScript中最常用的数组操作整理汇总

数组是最常见的数据结构之一,我们需要绝对自信地使用它。在这里,我将列出 JavaScript 中最重要的几个数组常用操作片段,包括数组长度、替换元素、去重以及许多其他内容。1、数组长度大多数人都知道可以像这样得到数组的长度:const arr = [1, 2, 3]; console.log(a...

vue-router是如何解析query参数呢? #前端

vue-router 中的 query 解析。1. 大家好,我是龙仔。今天来分享 vue-router 是如何解析快乐参数的,因为使用 vue 路由会传 query 参数和快乐参数,所以从 vue 的角度来看如何解析传递的快乐参数。2. 基础知识大家应知道,快乐参数结构如:a、b、c、a、b、c、a...

从 Vue2.0 到 React17——React 开发入门

作者:佚名来源:前端大全前言找工作时发现有一些公司是以React作为技术栈的,而且薪资待遇都不错,为了增加生存的筹码,所以还是得去学一下React,增加一项求生技能。因为我用Vue2.0开发项目已经四年了,故用Vue2.0开发项目的思路来学习React。前端项目是由一个个页面组成的,对于Vue来说,...