SpringBoot 2.X中的@Async和Java8中的completableFuture的使用比较
时间:2022-07-23
本文章向大家介绍SpringBoot 2.X中的@Async和Java8中的completableFuture的使用比较,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
背景
看到項目中有使用到Async注解和completetableFuture的runApply方法的使用。兩者都是異步提交方法的方式。那他两都分别在什么场景底下比较适用呢?
- 非常的明显的区别,一个是注解一个是方法调用。这样的话带来利好了。注解注释某个方法,那这个方法只要被调用就会产生异步。那使用的completableFuture的话你调用那个方法那个方法才会被异步。
- Async 产生的默认使用的线程池是不一样的。一个是forkJoinPool 一个是AsyncTaskExecutor。
- 两个都是用默认性能和产生的默认的线程数
@Async简介
为了使得异步可用,Spring提供了一个注解@EnableAsync如果Java的配置文件标注他,那么Spring就会开启同步可用,这样就可以使用注解@Async驱动Spring使用的异步调用,其中的默认线程池也就是AsyncTaskExecutor,默认参数为无限大(首先简单百度了下,网上提到@Async默认异步配置使用的是SimpleAsyncTaskExecutor,该线程池默认来一个任务创建一个线程,在大量的请求的时候,这时就会不断创建大量线程,极有可能压爆服务器内存。如下面的测试情况,无限创建线程) 使用Java配置demo:
package com springboot chapterl3.config
/**** imports ******/
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
//定义线程池
Override
public Executor getAsyncExecutor () {
//定义线程池
ThreadPoolTaskExecutor taskExecutor =new ThreadPoolTaskExecutor();
//核心线程数
taskExecutor setCorePool ze (10);
//线程池最大线程数
taskExecutor setMaxPoolS ze (30) ;
//线程队列最大线程数
taskExecutor . setQueueCapacity(2000) ;
//初始化
taskExecutor.initialize();
return taskExecutor;
}
}
CompleteTableTuture简介
点击:https://blog.csdn.net/weixin_40413961/article/details/107703172
两者demo压测比较
使用CompleteTableTuture demo
/**
* @author yuanxindong
* @date: 2020/7/31 16:53
*/
@Service
public class AsyncTest {
@Autowired
AsycMethodDemo asycMethodDemo;
@Test
public void runAsyncTask() throws InterruptedException {
Thread.sleep(50000);
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
AsycMethodDemo asycMethodDemo = applicationContext.getBean(AsycMethodDemo.class);
Integer i = 0;
for (i = 0; i < 100; i++) {
getTask(asycMethodDemo, i);
}
Thread.sleep(1000000);
}
private void getTask(AsycMethodDemo asycMethodDemo, Integer i) {
try {
CompletableFuture.runAsync(() -> {
try {
asycMethodDemo.asyncMethod(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
} catch (Exception e) {
}
}
}
运行结果:
除了主线程,根据图看到一共起了8个线程。是的forkJoinPool的默认核心线程数是根据CPU的核数来穿建的
- 使用Java8中的completableFuture的使用demo
/**
* @author yuanxindong
* @date: 2020/7/31 16:53
*/
@Service
public class AsyncTest {
@Autowired
AsycMethodDemo asycMethodDemo;
@Test
public void runAsyncTask() throws InterruptedException {
Thread.sleep(50000);
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
AsycMethodDemo asycMethodDemo = applicationContext.getBean(AsycMethodDemo.class);
int i = 0;
for( i = 0; i< 100;i++){
asycMethodDemo.asyncMethod(i);
System.out.println("任务"+i+"执行完成");
}
Thread.sleep(1000000);
}
}
运行结果:
可以看出,一共起了100个线程,由于线程起的多可以明显看到这几个任务执行完成的真的很快,这也就是传说中的时间并行执行吧,但是这里会有 一个问题那就是如果任务真的超级多的话,会不会爆掉。
总结
个人感觉Java 8的completeTable比较好用一些,也支持自定义。
- Spring的也是OK的,具体情景具体选择吧
- @Async的时候一定要设置线程数,以防万一OOM
- IoC在ASP.NET Web API中的应用
- 跟鹅厂老司机学技术之一:“遇见” Kotlin
- 简单的 H5 视频推流解决方案
- 来腾讯云开发者实验室学习.NET
- 跨域资源共享(CORS)在ASP.NET Web API中是如何实现的?
- 使用腾讯云 GPU 学习深度学习系列之六:物体的识别与定位
- npm5 新版功能特性解析及与 yarn 评测对比
- H5直播避坑指南
- 龙门阵之 DevOps 门外汉须知
- 全面进阶 H5 直播(上)
- 这年头,不会斗图都毕不了业?
- 龙妈也会死?《权力的游戏》 AI 算法预测丹妮女王危在旦夕
- 腾讯云 GAME-TECH 沙龙干货回顾:海外网络拓展及质量把控
- 通过扩展让ASP.NET Web API支持W3C的CORS规范
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- ubuntu下编译安装opencv的方法
- CentOS7如何执行PHP定时任务详解
- linux中ssh免密通信的实现
- Linux 启动停止SpringBoot jar 程序部署Shell 脚本的方法
- linux下安装boost库的完整步骤记录
- Linux下使用killall命令终止进程的8大用法实例详解
- 关于AIX挂载NFS写入效率低效的解决方法
- Linux查看进程的所有信息的方法示例
- 新版VPS主机管理面板WDCP安装及使用体验-国产简单易用型VPS面板
- linux中普通用户的定时任务详解
- 详解在Linux中清空或删除大文件内容的5种方法
- 教你一招实现Linux中的文本比对
- 怎么禁用 Ubuntu 服务器中终端欢迎消息中的广告
- Linux系统下部署项目的设置方法
- Linux中设置路由以及虚拟机联网图文详解