七叶笔记 » java编程 » 关于java中@Async异步调用详细解析附代码

关于java中@Async异步调用详细解析附代码

前言

异步调用与同步调用

同步调用:顺序执行,通过调用返回结果再次执行下一个调用异步调用:通过调用,无需等待返回结果,执行下一个调用

1. @Async讲解

其@Async的注解代码如下:

注解可以使用在类型以及方法中通过value定义其值,默认是空

一般这个注解需要配合@EnableAsync,起源码如下

主要通过该注解放置在启动类中进行配置启动

在启动类中添加如下:

2. 用法

2.1 同步调用

从调用到返回函数结果才能执行下一步,称为同步调用

service层 代码:

控制层代码模块:

通过springboot的启动类启动之后

输出如下:

开始

// 此为等待5秒钟,终端不显示也不关闭

结束

2.2 异步调用

异步调用,执行函数不用等返回结果就可以执行下一步

service层 代码:主要是添加了@Async注解标识这个方法

控制层代码模块:

通过调用service层函数

以及在启动类中加入注解启动 @EnableAsync

3. 自定义线程池

对于线程池的一些基本知识可看我之前的文章:

java如何正确关闭线程以及线程池(代码实践含源码分析)java线程池的创建方式详细分析(全)

如果不指定线程池,默认使用的线程池为SimpleAsyncTaskExecutor(来一个任务就创建一个线程,不断创建线程导致CPU过高引发OOM),自带的线程池一般都有弊端,一般推荐使用ThreadPoolExecutor(明确线程池的资源,规避风险)

具体如下:

newFixedThreadPool:定死了线程数,任务队列还是无界的,(最大线程数只有队列满了,最大线程数才会创建),所以会造成OOMnewCachedThreadPool:没有设置最大线程数上限,创建大量的线程容易卡顿或者直接OOM

通过自定义线程池可以调整线程池的配置,更好的资源利用

@Async这个注解查找 AsyncConfigurer接口(实现类为AsyncConfigurerSupport,默认配置和方法都是空),所以可重写接口指定线程池。

通过实现接口AsyncConfigurer继承AsyncConfigurerSupport自定义TaskExecutor(替代内置任务执行器)

第三种方法:

在application.xml中定义线程池的一些变量

自定义线程池如下

到此这篇关于关于java中@Async异步调用详细解析附代码的文章就介绍到这了,更多相关java @Async异步调用内容请搜索七叶笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持七叶笔记!

相关文章