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;
    }
相关推荐
喜欢敲代码的程序员1 小时前
SpringBoot+Mybatis+MySQL+Vue+ElementUI前后端分离版:项目搭建(一)
spring boot·mysql·elementui·vue·mybatis
华子w9089258592 小时前
基于 SpringBoot+Vue.js+ElementUI 的 “花开富贵“ 花园管理系统设计与实现7000字论文
vue.js·spring boot·elementui
小时候的阳光3 小时前
SpringBoot3 spring.factories 自动配置功能不生效?
spring boot·spring·失效·factories·imports
大只鹅3 小时前
Springboot3整合ehcache3缓存--XML配置和编程式配置
spring boot·缓存
执笔诉情殇〆4 小时前
springboot集成达梦数据库,取消MySQL数据库,解决问题和冲突
数据库·spring boot·mysql·达梦
hdsoft_huge5 小时前
Spring Boot 高并发框架实现方案:数字城市的奇妙之旅
java·spring boot·后端
gjh12086 小时前
Easy-excel监听器中对批量上传的工单做错误收集
java·spring boot
考虑考虑8 小时前
使用jpa中的group by返回一个数组对象
spring boot·后端·spring
十一0829938 小时前
【PDF-XSS攻击】springboot项目-上传文件-解决PDF文件XSS攻击
spring boot·pdf·xss
风象南9 小时前
Spring Shell命令行工具开发实战
java·spring boot·后端