@Async(一)

请直接看原文:

Spring @Async 注解的使用以及原理(一)_@async注解-CSDN博客

Spring @Async 注解的使用以及原理(二)_&#064-CSDN博客


上面源码已经讲的很详细了, 我下面只做几个总结就好了.

一.@Async的默认线程池为SimpleAsyncTaskExecutor默认每次调用都会创建一个新的线程。

Spring 已经实现的线程池

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

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

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

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

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

二.使用注意

@Async注解一般用在类的方法上,如果用在类上,那么这个类所有的方法都是异步执行的

看源码分析:

某某某通过委托实现@Async异步方法的调用。在invoke()方法中获取执行器executor,创建Callable异步线程任务,提交到执行器executor(对应的线程池)中执行。

@Async加在方法上有三种使用

  1. 最简单的异步调用,返回值为void

  2. 带参数的异步调用,异步方法可以传入参数

  3. 存在返回值,常调用返回Future

java 复制代码
/**
 2      * 异常调用返回Future
 3      *  对于返回值是Future,不会被AsyncUncaughtExceptionHandler处理,需要我们在方法中捕获异常并处理
 4      *  或者在调用方在调用Futrue.get时捕获异常进行处理
 5      * 
 6      * @param i
 7      * @return
 8      */
 9     @Async
10     public Future<String> asyncInvokeReturnFuture(int i) {
11         log.info("asyncInvokeReturnFuture, parementer={}", i);
12         Future<String> future;
13         try {
14             Thread.sleep(1000 * 1);
15             future = new AsyncResult<String>("success:" + i);
16             throw new IllegalArgumentException("a");
17         } catch (InterruptedException e) {
18             future = new AsyncResult<String>("error");
19         } catch(IllegalArgumentException e){
20             future = new AsyncResult<String>("error-IllegalArgumentException");
21         }
22         return future;
23     }

三.使用注意

看源码分析:@Async和@EnableAsync注解实现方法异步调用底层是通过AOP和线程池实现的。

通过委托实现@Async异步方法的调用。在invoke()方法中获取执行器executor,创建Callable异步线程任务,提交到执行器executor(对应的线程池)中执行。

因此要注意:

1.所使用的@Async注解方法的类对象应该是Spring容器管理的bean对象

2.不能用本类方法调本类有@Async注解的方法,相当于this,会使代理失效,会使@Async注解失效

四.使用注意

不同类中的加了@Async注解的方法,可以相互调用,调一个加了@Async注解的方法就相当于新开了一个线程去执行这个方法.仅此而已

相关推荐
这个昵称不容易1 小时前
SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在
java·springboot·毕设
计算机毕设定制辅导-无忧学长1 小时前
《基于微信小程序的居家医疗陪护预约系统设计与实现》
java·spring boot·微信小程序·uniapp·居家医疗陪护预约系统
文丑颜不良啊3 小时前
LeetCode2221~2240题目解析
java·leetcode
秋饼3 小时前
Computer Use Agent Java 落地实战:感知-行动循环、执行器与安全围栏生产级实现
java·ai·技术分享·后端开发
文丑颜不良啊5 小时前
LeetCode2161~2180题目解析
java·leetcode
文丑颜不良啊7 小时前
LeetCode2141~2160题目解析
java·leetcode
LabVIEW开发7 小时前
LabVIEW 连接板:28 个端子怎么排,优先级怎么定
java·算法·labview
天天被压力7 小时前
【A股分钟级高频数据完全手册 #07】北交所历史分钟K线接口:京市Pro版分时批量
java·人工智能·python
天天被压力7 小时前
【A股分钟级高频数据完全手册 #08】股票日、分时数据接口对比:普通分时与Pro版差异实测
java·人工智能·python
特立独行的猫A8 小时前
AI 时代,我为什么推荐用 cj-tauri 开发桌面应用
java·后端·python