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;
    }
相关推荐
晚安里8 分钟前
Spring 框架(IoC、AOP、Spring Boot) 的必会知识点汇总
java·spring boot·spring
上官浩仁1 小时前
springboot ioc 控制反转入门与实战
java·spring boot·spring
叫我阿柒啊1 小时前
从Java全栈到前端框架:一位程序员的实战之路
java·spring boot·微服务·消息队列·vue3·前端开发·后端开发
中国胖子风清扬2 小时前
Rust 序列化技术全解析:从基础到实战
开发语言·c++·spring boot·vscode·后端·中间件·rust
JosieBook6 小时前
【SpringBoot】21-Spring Boot中Web页面抽取公共页面的完整实践
前端·spring boot·python
刘一说6 小时前
Spring Boot+Nacos+MySQL微服务问题排查指南
spring boot·mysql·微服务
叫我阿柒啊10 小时前
从Java全栈到云原生:一场技术深度对话
java·spring boot·docker·微服务·typescript·消息队列·vue3
计算机毕设定制辅导-无忧学长11 小时前
MQTT 与 Java 框架集成:Spring Boot 实战(一)
java·网络·spring boot
叫我阿柒啊11 小时前
从Java全栈到Vue3实战:一次真实面试的深度复盘
java·spring boot·微服务·vue3·响应式编程·前后端分离·restful api
泉城老铁11 小时前
Spring Boot中实现多线程分片下载
java·spring boot·后端