详解Spring里的Async注解实现异步操作方法

  • 时间:
  • 7719人关注

这篇文章主要介绍了Spring里的Async注解实现异步操作的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学,另外这篇文章主要知识点是关于spring异步注解、Spring、Async注解异步、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子资料:

异步执行一般用来发送一些消息数据,数据一致性不要求太高的场景,对于spring来说,它把这个异步进行了封装,使用一个注解就可以实现。

何为异步调用?

在解释异步调用之前,我们先来看同步调用的定义;同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果。 异步调用则是只是发送了调用的指令,调用者无需等待被调用的方法完全执行完毕;而是继续执行下面的流程。例如, 在某个调用中,需要顺序调用 A, B, C三个过程方法;如他们都是同步调用,则需要将他们都顺序执行完毕之后,方算作过程执行完毕; 如B为一个异步的调用方法,则在执行完A之后,调用B,并不等待B完成,而是执行开始调用C,待C执行完毕之后,就意味着这个过程执行完毕了。

@Async介绍

在Spring中,基于@Async标注的方法,称之为异步方法;这些方法将在执行的时候,将会在独立的线程中被执行,调用者无需等待它的完成,即可继续其他的操作。

分为不带参数的异步调用;带参数的异步调用;调用返回Future的异步线程

@Async调用中的事务处理机制

在@Async标注的方法,同时也适用了@Transactional进行了标注;在其调用数据库操作之时,将无法产生事务管理的控制,原因就在于其是基于异步处理的操作。 那该如何给这些操作添加事务管理呢?可以将需要事务管理操作的方法放置到异步方法内部,在内部被调用的方法上添加@Transactional. 例如: 方法A,使用了@Async/@Transactional来标注,但是无法产生事务控制的目的。 方法B,使用了@Async来标注, B中调用了C、D,C/D分别使用@Transactional做了标注,则可实现事务控制的目的。

用法

1.程序启动时开启@EnableAsync注解

2.建立新的类型,建立异步方法,为方法添加@Async注解

3.在业务代码中,@Autowired注入你的类型,使用它即可

我们可以关注到在配置task的时候,是有参数让我们配置线程池的数量的。因为这种实现方法,所以在同一个类中的方法调用,添加@async注解是失效的!,原因是当你在同一个类中的时候,方法调用是在类体内执行的,spring无法截获这个方法调用.

Async几种方式

1.没有返回值的,不会阻塞主线程,相当于开启新线程在后台执行这个任务

  @Async
  public String sayHello2() throws InterruptedException {
    Thread.sleep(2 * 1000);//网络连接中 。。。消息发送中。。。
    return "我爱你啊!";// 调用方调用后会立即返回,所以返回null
  }

1.带有返回值的,返回类型必须为Future<>,它会开启新的线程执行任务,并阻塞主线程,执行完成后把结果返回给主线程

 @Async
 public Future<String> asyncFunc() throws InterruptedException {
  int thinking = 2;
  Thread.sleep(thinking * 1000);
  System.out.println("async!");
  return new AsyncResult<String>("发送消息用了" + thinking + "秒");
 }

调用方法

 @GetMapping("/lind-demo/asyncFunc")
 public void async() throws Exception {
  Future<String> future = null;
  future = asyncService.asyncFunc();
  System.out.println(future.get());
  System.out.println("主线程被阻塞执行完成");
 }

执行结果

async!
发送消息用了2秒
主线程执行完成

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。


上一篇:java邮件通知工具类代码详解

下一篇:Java锁粗化与循环问题详解

相关内容

  • Springboot停止服务的方法总结

    这篇文章主要介绍了详解Springboot 优雅停止服务的几种方法 ,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    11-21详解Springboot优雅停止服务的几种方法

    阅读更多
  • Spring Cloud Stream异常处理过程讲解

    这篇文章主要介绍了Spring Cloud Stream异常处理过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    03-25Spring Cloud Stream异常处理过程解析

    阅读更多
  • Springboot+redis+Interceptor+自定义annotation实现接口自动幂等

    本篇文章给大家介绍了使用springboot和拦截器、redis来优雅的实现接口幂等,对于幂等在实际的开发过程中是十分重要的,因为一个接口可能会被无数的客户端调用,如何保证其不影响后台的业务

    04-26接口自动幂实现方法

    阅读更多
  • Spring IOC 容器启动流程分析

    这篇文章主要介绍了Spring IOC 容器启动流程分析,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

    04-09Spring IOC 容器启动流程

    阅读更多
  • Spring中的事务传播行为代码例子

    这篇文章主要给大家介绍了关于Spring中事务传播行为的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    01-16Spring中的事务传播行为示例详解

    阅读更多
  • Spring Cloud微服务实战

    Spring Cloud微服务实战

    《Spring Cloud微服务实战》 从时下流行的微服务架构概念出发,详细介绍了Spring Cloud针对微服务架构中几大核心要素的解决方案和基础组件。对于各个组件的介绍,《Spring Cloud微服务实战》主要

    大小:175.5 MB微服务

    点击下载
  • Spring Boot 2+Thymeleaf企业应用实战

    Spring Boot 2+Thymeleaf企业应用实战

    大小:215.6 MBSpring Boot

    点击下载
  • Spring实战(中文4,5版)

    Spring实战(中文4,5版)

    本书是一套经典的、畅销的Spring学习和实践指南,适用于已具有一定Java 编程基础的读者,这里带来的是英文原版,带源码,欢迎下载

    大小:16.4 MBSpring

    点击下载
  • Spring Cloud与Docker微服务架构实战

    Spring Cloud与Docker微服务架构实战

    Spring Cloud与Docker微服务架构实战 可分为三部分,第1章对微服务架构进行了系统的介绍;第2-11章使用Spring Cloud开发框架编写了一个电影售票系统;第12-14章则讲解了如何将微服务应用运行在Do

    大小:100 MB微服务

    点击下载
  • Spring Cloud与Docker高并发微服务架构设计实施

    Spring Cloud与Docker高并发微服务架构设计实施

    大小:143.2 MB微服务

    点击下载
  • Spring Boot开发实战

    Spring Boot开发实战

    大小:194.8 MBSpring Boot

    点击下载
  • 深入理解Spring Cloud与微服务构建

    深入理解Spring Cloud与微服务构建

    深入浅出讲解Spring Cloud组件、开发工具、框架等知识点。使读者全面理解微服务的构建原理。实例丰富,解释清晰,易于读者真正理解原理,并学以致用。深入讲解Spring Cloud OAuth2,直击市场需求痛点。

    大小:173.49 MB微服务

    点击下载
  • 一步一步学Spring Boot 2

    一步一步学Spring Boot 2

    本书主要内容包括Spring Boot环境搭建、Spring Boot常用标签、Spring Boot集成Redis、数据库MySQL、Spring Data、日志Log4J、Thymeleaf模板引擎、ActiveMQ消息、MyBatis等流行技术,以及利用Spring Boot实现邮件发送、Quartz定时器、过滤器Filter和监听器Listener等。

    大小:72.04 MBSpring Boot

    点击下载
  • 微服务架构实战:基于Spring Boot、Spring Cloud、Docker

    微服务架构实战:基于Spring Boot、Spring Cloud、Docker

    1.根据SpringBoot、SpringCloud、Docker等技术性搭建微保障体系。 2.精减而详细的经典案例展现保持分布式架构的详细宏伟蓝图。 3.融合业务流程情景,根据全方位实例得出专用工具在搭建分布式架构

    大小:179.6 MB微服务

    点击下载
  • Spring学习指南

    Spring学习指南

    Spring框架 是以简化J2EE应用程序开发为特定目标而创建的,是当前流行的Java开发框架。 Spring学习指南(第3版) 从介绍Spring框架入手,针对Spring 4.3和Java 8介绍bean的配置、依赖注入、定义bean、基于

    大小:263.3 MBSpring

    点击下载

学习笔记

43小时4分钟前回答

介绍Python如何使用asyncio包处理并发

这篇文章主要为大家详细介绍了Python使用asyncio包处理并发的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 阻塞型I/O和GIL CPython 解释器本身就不是线程安全的,因此有全局解释器锁(GIL),一次只允许使用一个线程执行 Python 字节码。因此,一个 Python 进程通常不能同时使用多个 CPU 核心。 然而,标准库中所有执行阻塞型 I/O 操作的函数,在等待操作系统返回结果时都会释放GIL。这意味着在 Python 语言这个层次上可以使用多线程,而 I/O 密集型 Python 程序能从中受益:一个 Python 线程等待网络响应时,阻塞型 I/O 函数会释放 GIL,再运行一个线程。 asyncio 这个包使用事件循环驱动的协程实现……

29小时2分钟前回答

python用asyncio处理并发实例

asyncio 在Python 2的时代,高性能的网络编程主要是使用Twisted、Tornado和Gevent这三个库,但是它们的异步代码相互之间既不兼容也不能移植。如上一节说的,Gvanrossum希望在Python 3 实现一个原生的基于生成器的协程库,其中直接内置了对异步IO的支持,这就是asyncio,它在Python 3.4被引入到标准库。 asyncio 这个包使用事件循环驱动的协程实现并发。 asyncio 包在引入标准库之前代号 Tulip(郁金香),所以在网上搜索资料时,会经常看到这种花的名字。 什么是事件循环? wiki 上说:事件循环是一种等待程序分配事件或者消息的编程架构。基本上来说事件循环就是:当A发生时,执行B。或者用最简单的例子来解释这一概……

15小时35分钟前回答

详解async/await与promise(nodejs中的异步操作问题)

举例写文章详情页面的时候的一个场景:首先更改文章详情中的 PV,然后读取文章详情,然后根据文章详情中文章 Id 查阅该文章评论和该文章作者信息。获取全部数据之后渲染文章详情页。数据库操作都是异步的,最直接想到的办法就是一层一层的回调函数,问题出来了:十分不雅观,要是层再多一点还会有更多麻烦。怎么解决?业内为了处理异步操作问题也是拼了,什么async,q,bluebird,co,处理方式不同,各有千秋,感兴趣可以了解一下,但是惊喜的发现nodejs 7.6已经默认支持ES7中的 async/await 了,结合ES6中的 promise对象,用起来不亦乐乎的。 Async/await的主要益处是可以避免回调地狱(callback hell)问……