当前位置: 首页 > news >正文

SpringBoot + 虚拟线程,性能炸裂!

一、什么是虚拟线程

虚拟线程是Java19开始增加的一个特性,和Golang的携程类似,一个其它语言早就提供的、且如此实用且好用的功能,作为一个Java开发者,早就已经望眼欲穿了。

二、虚拟线程和普通线程的区别

“虚拟”线程,望文生义,它是“假”的,它不直接调度操作系统的线程,而是由JVM再提供一层线程的接口抽象,由普通线程调度,即一个普通的操作系统线程可以调度成千上万个虚拟线程。

虚拟线程比普通线程的消耗要小得多得多,在内存足够的情况下,我们甚至可以创建上百万的虚拟线程,这在之前(Java19以前)是不可能的。

三、SpringBoot使用虚拟线程

配置

首先我们使用的Java版本是java-20.0.2-oracle,SpringBoot版本是3.1.2。

要在SpringBoot中使用虚拟线程很简单,增加如下配置即可:

/*** 配置是用于稍后测试,spring.virtual-thread=true是使用虚拟线程,false时还是使用默认的普通线程*/
@Configuration
@ConditionalOnProperty(prefix = "spring", name = "virtual-thread", havingValue = "true")
public class ThreadConfig {@Beanpublic AsyncTaskExecutor applicationTaskExecutor() {return new TaskExecutorAdapter(Executors.newVirtualThreadPerTaskExecutor());}@Beanpublic TomcatProtocolHandlerCustomizer<?> protocolHandlerCustomizer() {return protocolHandler -> {protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());};}
}

@Async性能对比
我们写一个异步service,里面睡眠50ms,模拟MySQL或Redis等IO操作:

@Service
public class AsyncService {/*** * @param countDownLatch 用于测试*/@Asyncpublic void doSomething(CountDownLatch countDownLatch) throws InterruptedException {Thread.sleep(50);countDownLatch.countDown();}
}

最后测试类,很简单,就是循环调用这个方法10万次,计算所有方法执行完成的消耗的时间:

@Test
public void testAsync() throws InterruptedException {long start = System.currentTimeMillis();int n = 100000;CountDownLatch countDownLatch = new CountDownLatch(n);for (int i = 0; i < n; i++) {asyncService.doSomething(countDownLatch);}countDownLatch.await();long end = System.currentTimeMillis();System.out.println("耗时:" + (end - start) + "ms");
}
普通线程耗时:678秒左右,超过10分钟了

图片

虚拟线程耗时:3.9秒!!
在这里插入图片描述

http://www.lryc.cn/news/389369.html

相关文章:

  • Java Character类
  • Python中的爬虫实战:猫眼电影爬虫
  • WAIC2024 | 华院计算邀您共赴2024年世界人工智能大会,见证未来科技革新
  • 数据库原理之数据库基本概念
  • vue2项目的打包以及部署
  • Java的全局异常处理代码
  • Hi3861 OpenHarmony嵌入式应用入门--LiteOS semaphore作为锁
  • 注意!年龄越大,社交圈子越窄?其实这是老人的理性选择!数学家告诉你:何时该跳槽,何时该坚守!你必须知道的三个智慧:让你的人生更加精彩!
  • [SwiftUI 开发] 嵌套的ObservedObject中的更改不会更新UI
  • 全面了解机器学习
  • 作为图形渲染API,OpenGL和Direct3D的全方位对比。
  • 安装Rabbitmq遇到的坑
  • React+TS 从零开始教程(4):useEffect
  • 网络安全学习路线图(2024版详解)
  • 你了解人工智能吗?
  • 如何使用Vue.js实现动态文档生成与下载功能
  • web基础及http协议
  • 【vuejs】vue-router 之 addRoute 动态路由的应用总结
  • LeetCode 30. 串联所有单词的子串
  • python本学期所有代码!
  • 武汉星起航:无锡跨境电商加速“出海”,物流升级助品牌全球布局
  • Python+Pytest+Allure+Yaml+Pymysql+Jenkins+GitLab接口自动化测试框架详解
  • stm32-hal库(5)--usart串口通信三种模式(主从通信)(关于通信失败和串口不断发送数据问题的解决)
  • 一文学会LVS:概念、架构、原理、搭建过程、常用命令及实战案例
  • [Go 微服务] Kratos 使用的简单总结
  • 【unity实战】使用旧输入系统Input Manager 写一个 2D 平台游戏玩家控制器——包括移动、跳跃、滑墙、蹬墙跳
  • 【实战】EasyExcel实现百万级数据导入导出
  • Graalvm配置文件与Feature和Substitute机制介绍
  • Appium adb 获取appActivity
  • 调整分区失败致盘无法访问:深度解析与数据恢复全攻略