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

Spring Boot使用JDK 21虚拟线程

JDK 21引入的虚拟线程(Virtual Threads)是 Project Loom 的一部分,旨在显著简化并发编程并提高 Java 应用的可扩展性。以下是虚拟线程的主要特点:

1. 概念

虚拟线程是轻量级线程,与传统的操作系统线程不同,它们由 JVM 管理,消耗资源极少,可以支持数百万级别的并发。

2. 优点

  • 高并发:虚拟线程消耗更少的内存,可以轻松创建大量线程,解决传统线程的规模化问题。
  • 阻塞友好:虚拟线程可以高效地处理阻塞操作(如 I/O),避免线程阻塞导致资源浪费。
  • 调试和分析一致性:虚拟线程和传统线程使用相同的 API,开发和调试体验一致。
  • 更简单的代码:简化异步编程,无需使用复杂的回调或 Future。

3. 适用场景

  • 高并发服务器:Web 服务、微服务。
  • 数据处理:数据库访问、文件处理。
  • 事件驱动架构:高吞吐事件流处理。

总的来说,JDK 21 的虚拟线程为 Java 并发编程带来了革命性变化,尤其适合需要高并发处理的现代应用。
 

配置类:

/*** @author Test* date 2024/11/29 17:52* description 虚拟线程配置*/
@Configuration
public class VirtualThreadConfig {@Beanpublic ExecutorService virtualThreadExecutor() {return Executors.newVirtualThreadPerTaskExecutor();}
}

代码实现:

@Resource
private ExecutorService executorService;/*** 异步执行多个任务* @return*/
public void test1() {for (int i = 0; i < 1000; i++) {int finalI = i;executorService.submit(() ->{System.out.println("处理数据:" + finalI + ",线程:" + Thread.currentThread());try {Thread.sleep(1000); // 模拟耗时操作} catch (InterruptedException e) {e.printStackTrace();}});}
}/*** 同时执行多个任务并返回* @return*/
public List<String> test2() {// 模拟一组数据List<String> data = List.of("Data1", "Data2", "Data3", "Data4", "Data5", "Data6", "Data7", "Data8", "Data9", "Data10", "Data11", "Data12", "Data13", "Data14", "Data15", "Data16");try {// 创建并发任务List<Callable<String>> tasks = data.stream().map(d -> (Callable<String>) () -> processData(d)).collect(Collectors.toList());// 使用 invokeAll 执行并发任务,等待所有任务完成List<Future<String>> futures = executorService.invokeAll(tasks);// 收集并返回所有任务结果return futures.stream().map(future -> {try {// 获取每个任务的结果return future.get();} catch (InterruptedException | ExecutionException e) {// 处理中断Thread.currentThread().interrupt();throw new ApiException("虚拟线程数据处理异常");}}).collect(Collectors.toList());} catch (InterruptedException e) {// 处理中断Thread.currentThread().interrupt();throw new ApiException("虚拟线程数据处理异常");}}// 模拟数据处理方法private static String processData(String data) {try {// 模拟耗时操作,例如 I/O 操作Thread.sleep(1000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}System.out.println("Processed: " + data);return "Processed: " + data;}


http://www.mrgr.cn/news/78603.html

相关文章:

  • 《心灵奇旅》观后感
  • 力扣第 73 题 矩阵置零
  • 基于投影寻踪博弈论-云模型的滑坡风险评价
  • 大数据新视界 -- 大数据大厂之 Hive 数据安全:权限管理体系的深度解读(上)(15/ 30)
  • 力扣刷题TOP101:6.BM7 链表中环的入口结点
  • 理解 Python PIL库中的 convert(‘RGB‘) 方法:为何及如何将图像转换为RGB模式
  • 在shardingsphere执行存储过程
  • 机器学习实战:泰坦尼克号乘客生存率预测(数据处理+特征工程+建模预测)
  • vulnhub靶场之hackableⅡ
  • 【C语言】字符串左旋的三种解题方法详细分析
  • Jmeter进阶篇(29)AI+性能测试领域场景落地
  • Linux系统 进程
  • 三十二:网络爬虫的工作原理与应对方式
  • 记录学习《手动学习深度学习》这本书的笔记(一)
  • (Python)前缀和
  • OPTEE v4.4.0 FVP环境搭建(支持hafnium)
  • 【北京迅为】iTOP-4412全能版使用手册-第二十章 搭建和测试NFS服务器
  • Spring源码学习
  • Python字典的用法(定义、增加、删除、修改、查询、遍历)
  • Spring中每次访问数据库都要创建SqlSession吗?
  • LearnOpenGL 学习(入门--三角形,着色器,纹理)
  • redis中的哨兵
  • ISO26262-基于TC397的MPU内存保护
  • mysql_题库详解
  • pyspark实现基于协同过滤的电影推荐系统
  • C底层 函数栈帧