Spring异步方法注解 @Async
@Async
0. 介绍
在Spring 3.x之后,通过内置@Async标明异步方法,可以简化异步开发流程。
@Async既可提供无返回值的调用,也可提供有返回值的调用,下文将分别介绍两种使用方式。
1. 代码Demo
1.1 线程池配置
Spring线程池配置有两种基本配置方式,此处实用其中一种
<task:executor id="myexecutor" pool-size="5" />
<task:annotation-driven executor="myexecutor"/>
1.2 无返回值的调用方式
- 测试类
@Component
public class AsyncTask {
@Async
public void exec() throws Exception{
System.out.println("准备睡觉:" + System.currentTimeMillis());
Thread.sleep(10);
System.out.println("醒了");
}
}
-测试代码
public class AsyncTaskTest extends AbstractTest {
@Autowired
private AsyncTask asyncTask;
@Test
public void testExec() throws Exception {
for (int i= 0; i<5;i++)
asyncTask.exec();
Thread.sleep(1000L);
}
}
- 测试结果
准备睡觉:1511882628039
准备睡觉:1511882628039
准备睡觉:1511882628039
准备睡觉:1511882628039
准备睡觉:1511882628039
醒了
醒了
醒了
醒了
醒了
- 结果分析
从代码输出来看,五个任务在同一时间被执行,说明@Async注解能够达到异步执行方法的目的。
1.3 有返回值的调用
@Async标记的方法,可返回AsyncResult结果,该类为Future子类,因此该类可通过future.get()和future.get(long timeout, TimeUnit unit)拿到返回结果;
- 测试类
@Component
public class AsyncTask {
@Async
public Future<String> exec() throws Exception{
System.out.println("准备睡觉" + System.currentTimeMillis());
Thread.sleep(10);
System.out.println("醒了");
return new AsyncResult<String>("有力气了");
}
}
- 测试代码
public class AsyncTaskTest extends AbstractTest {
@Autowired
private AsyncTask asyncTask;
@Test
public void testExec() throws Exception {
String asyncResult1 = asyncTask.exec().get();
String asyncResult2 = asyncTask.exec().get();
String asyncResult3 = asyncTask.exec().get();
String asyncResult4 = asyncTask.exec().get(50, TimeUnit.MILLISECONDS);
String asyncResult5 = asyncTask.exec().get(50, TimeUnit.MILLISECONDS);
System.out.println("result1:" + asyncResult1);
System.out.println("result2:" + asyncResult2);
System.out.println("result3:" + asyncResult3);
System.out.println("result4:" + asyncResult4);
System.out.println("result5:" + asyncResult5);
}
}
- 测试结果
准备睡觉1511883563474
醒了
准备睡觉1511883563487
醒了
准备睡觉1511883563498
醒了
准备睡觉1511883563510
醒了
准备睡觉1511883563521
醒了
result1:有力气了
result2:有力气了
result3:有力气了
result4:有力气了
result5:有力气了
- 结果分析
通过设置超时时,可在约定时间内获取结果,避免程序hang住,该方法较为实用。
Spring异步方法注解 @Async的更多相关文章
- 关于Dubbo和Spring异步注解@Async的冲突
项目中难免会有异步处理的需求,像异步记录日志啦,异步发送邮件啦,而Dubbo又是现在主流的分布式框架,所有异步+Dubbo的组合是再所难免的 但博主是实践中发现Dubbo的服务并不能很好的跟Sprin ...
- 如何在项目中使用Spring异步调用注解@Async
本文主要介绍如何使用Spring框架提供的异步调用注解@Async,异步线程池配置.异常捕获处理. 开启@Async注解支持 使用@Async注解的之前,必须在项目中启动时调用@EnableAsync ...
- spring中使用@Async注解进行异步处理
引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3. ...
- Spring中异步注解@Async的使用、原理及使用时可能导致的问题
前言 其实最近都在研究事务相关的内容,之所以写这么一篇文章是因为前面写了一篇关于循环依赖的文章: <面试必杀技,讲一讲Spring中的循环依赖> 然后,很多同学碰到了下面这个问题,添加了S ...
- Spring系列之Spring常用注解总结
传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件 ...
- Spring常用注解简析
1. Autowired 自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property.当然,getter看个人需求,如果私有属性需要对外提供的话,应当 ...
- Spring常用注解总结
转载自:https://www.cnblogs.com/xiaoxi/p/5935009.html 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点 ...
- Spring及SpringBoot @Async配置步骤及注意事项
前言 最近在做一个用户反馈的功能,就是当用户反馈意见或建议后服务端将意见保存然后发邮件给相关模块的开发者.考虑发邮件耗时的情况所以我想用异步的方法去执行,于是就开始研究Spring的@Async了.但 ...
- Spring注解 系列之Spring常用注解总结
参考:Spring系列之Spring常用注解总结 (1) Resource 默认是byName的方式进行bean配置,@AutoWired默认是按照byType的方式进行装配bean的:(2)Comp ...
随机推荐
- 2017.1-TOP5 Android开源库
Colorful (Github) Colorful简单实用,通过这个开源库可以通过编码的方式来改变应用的主题,不再需要定义不同的style dependencies { compile 'com.g ...
- 关于python的二维数组
test =[ [1, 2, 3], [4, 5, 6], [7, 8, 9]] #这个就可以看做是二维数组了,直接创建print(test)print(test[:][1]) ...
- 关于python的冒号截取
https://zhidao.baidu.com/question/877855739656978372.html
- FZU Problem 2062 Suneast & Yayamao
http://acm.fzu.edu.cn/problem.php?pid=2062 题目大意: 给你一个数n,要求求出用多少个数字可以表示1~n的所有数. 思路: 分解为二进制. 对于一个数n,看它 ...
- oracle expdp 备份脚本
#!/bin/bash#Oracle 环境变量 NLS_LANG=AMERICAN_AMERICA.AL32UTF8 ORACLE_SID=zgw ORACLE_BASE=/opt/oracle OR ...
- 最新GitHub新手使用教程(Linux/Ubuntu Git从安装到使用)——详细图解
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 一.叙述 1.说明:需要在Windows 安装Git的同学,可以查看该篇博客 https://blog.csdn.net/qq_4 ...
- Swift UIView 层次调整
Swift 中添加的UIView都是有层级的. 我们先添加三个看一看 let view1=UIView(frame: CGRectMake(10, 50, 200, 200)) let view2=U ...
- (转)const char to LPCTSTR不能转化问题
转: const char to LPCTSTR不能转化问题 Visual C++ 2008里cannot convert parameter 1 from 'const char [13]' to ...
- Android 底部TabActivity(0)——开篇(界面分析|系列文章文件夹)
当下主流的软件没有一个统一明白的风格,App框架什么样的都有,但个人钟情于页面底部Tab分签架构,移动设备的屏幕尽管越来越大,可是显示的内容还是有限,为了能展示很多其它的内容,方便简洁的操作习惯中Ta ...
- DMA 如何查看它有没有传输完成 传输完成再开启
摘自:https://blog.csdn.net/zzwdkxx/article/details/9026173 /////////////////////////////////////////// ...