Spring Boot使用JDK 21虚拟线程

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

1. 概念

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

2. 优点

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

3. 适用场景

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

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

配置类:

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

代码实现:

java 复制代码
@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;
    }
相关推荐
jktantan2 小时前
注解式脱敏:用 Jackson 的 ContextualSerializer 做字段级策略(一)
spring boot·后端·算法·spring cloud·系统架构
露天赏雪16 小时前
第3篇:Sentinel熔断降级实战:大模型接口抖动时的服务兜底方案
java·开发语言·人工智能·spring boot·spring·servlet·sentinel
蜗牛8751 天前
为 Spring Boot 团队做一个 Elasticsearch 查询工作台:六种模式、语义补全与浏览器直连
spring boot
养军博客1 天前
Spring Boot 3.x + Spring Security 6.x 整合 JWT 实战:jjwt 与 java-jwt 两种工具库详解
java·spring boot·springsecurity
txxzjmzlh2 天前
SpringBoot 统⼀功能处理
java·spring boot·后端
秋天的怀念_David2 天前
算法一千零一夜 · 第二十六夜 协议的母语
java·spring boot·算法
余槐i2 天前
MySQL 8.0 联合索引走错:为什么加了索引查询反而从 200ms 变成 8s
java·spring boot·mysql·docker·性能优化
nice_lcj5202 天前
【从零理解 Spring AI · 03】Spring AI 在 Spring 生态里的位置
java·spring boot·大模型·spring ai·ai应用开发
AI源码3 天前
旅游推荐管理系统
spring boot
aiks_yuan3 天前
Spring Boot SSE 流式输出变成一次性返回怎么办:大模型打字机效果失效的 5 个原因(Spring Boot 4.1.2 实测)
spring boot