@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的更多相关文章

  1. 关于Dubbo和Spring异步注解@Async的冲突

    项目中难免会有异步处理的需求,像异步记录日志啦,异步发送邮件啦,而Dubbo又是现在主流的分布式框架,所有异步+Dubbo的组合是再所难免的 但博主是实践中发现Dubbo的服务并不能很好的跟Sprin ...

  2. 如何在项目中使用Spring异步调用注解@Async

    本文主要介绍如何使用Spring框架提供的异步调用注解@Async,异步线程池配置.异常捕获处理. 开启@Async注解支持 使用@Async注解的之前,必须在项目中启动时调用@EnableAsync ...

  3. spring中使用@Async注解进行异步处理

    引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3. ...

  4. Spring中异步注解@Async的使用、原理及使用时可能导致的问题

    前言 其实最近都在研究事务相关的内容,之所以写这么一篇文章是因为前面写了一篇关于循环依赖的文章: <面试必杀技,讲一讲Spring中的循环依赖> 然后,很多同学碰到了下面这个问题,添加了S ...

  5. Spring系列之Spring常用注解总结

    传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件 ...

  6. Spring常用注解简析

    1. Autowired 自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property.当然,getter看个人需求,如果私有属性需要对外提供的话,应当 ...

  7. Spring常用注解总结

    转载自:https://www.cnblogs.com/xiaoxi/p/5935009.html 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点 ...

  8. Spring及SpringBoot @Async配置步骤及注意事项

    前言 最近在做一个用户反馈的功能,就是当用户反馈意见或建议后服务端将意见保存然后发邮件给相关模块的开发者.考虑发邮件耗时的情况所以我想用异步的方法去执行,于是就开始研究Spring的@Async了.但 ...

  9. Spring注解 系列之Spring常用注解总结

    参考:Spring系列之Spring常用注解总结 (1) Resource 默认是byName的方式进行bean配置,@AutoWired默认是按照byType的方式进行装配bean的:(2)Comp ...

随机推荐

  1. (转) 设置sqlplus中的退格键

    转自:http://blog.itpub.net/26110315/viewspace-717249/ 有些时候当你使用sqlplus登录到数据库中的时候,敲错了命令想要删除修改的时候,发现以前敲入的 ...

  2. iOS开发 非常全的三方库、插件、大牛博客等等

    UI 下拉刷新 EGOTableViewPullRefresh- 最早的下拉刷新控件. SVPullToRefresh- 下拉刷新控件. MJRefresh- 仅需一行代码就可以为UITableVie ...

  3. FTP中的授权规则

    在授权规则中,你可以管理自己的FTP站点以怎样的方式进行访问,比如每个进入站点的人都需要输入用户名密码.正则可以在授权规则中删除默认的配置“允许匿名用户读取”的规则. 也可以在此处,对不同的组或用户进 ...

  4. 这一篇sigmoid和softmax的比较,讲的不错

    文章: http://blog.csdn.net/u014422406/article/details/52805924 sigmoid函数(也叫逻辑斯谛函数):  引用wiki百科的定义: A lo ...

  5. Android Java使用JavaMail API发送和接收邮件的代码示例

    JavaMail是Oracle甲骨文开发的Java邮件类API,支持多种邮件协议,这里我们就来看一下Java使用JavaMail API发送和接收邮件的代码示例 使用Javamail发送邮件,必需的j ...

  6. Eclipse "Could not create java virtual machine"的问题解决

    今天到了新的环境,需要重新搭建Android的开发环境,下载eclipse并安装了JDK1.6后,启动eclipse,发现出现了错误“Could not create Javavirtual mach ...

  7. HDU 1997汉诺塔VII

    又是汉诺塔~ 回顾一下汉诺塔的移动过程. 从左到右设为A,B,C  3个盘子的时候 1: No.1  A -> C 2: No.2  A -> B 3: No.1  C -> B 4 ...

  8. OC学习篇之---类的定义

    OC中类的相关知识 OC和C的最大区别就是具有了面向对象的功能,那么说到面向对象,就不得不说类这个概念了,如果学过Java的话,那么对类和对象的概念就不陌生了,因为Java是非常纯正的面向对象设计语言 ...

  9. [Angular 2] Share Template Content In Another Template With Content Projection <ng-content>

    Angular 1 provided a mechanism to place content from your template inside of another template called ...

  10. vue项目中一些文件的作用

    原文 简书原文:https://www.jianshu.com/p/38749e5bec3c 大纲 1.vue项目结构 2.主要的配置文件 2.1.package.json 2.2.dev-serve ...