logo
0
0
WeChat Login
ruok<ruoook@qq.com>
Initial commit

Java 虚拟线程演示项目

一个基于 Spring Boot 3.3.3 和 Java 21 的虚拟线程技术演示项目,展示了虚拟线程的各种应用场景和性能优势。

🌟 项目特点

  • 最新技术栈: 使用 Java 21 和 Spring Boot 3.3.3
  • 虚拟线程: 全面展示 Java 21 虚拟线程特性
  • 性能对比: 包含虚拟线程与平台线程的性能测试
  • 实际应用: 提供 Socket 通信、异步任务等实际应用场景
  • 配置简单: 零配置即可体验虚拟线程的强大功能

🚀 技术栈

  • Java 21 - 最新的 LTS 版本,支持虚拟线程
  • Spring Boot 3.3.3 - 现代化的 Java 应用框架
  • Maven - 项目构建和依赖管理
  • Lombok - 简化 Java 代码开发

📋 环境要求

  • Java 21 或更高版本
  • Maven 3.6+

📊 虚拟线程优势

轻量级并发

  • 虚拟线程: 可以创建数百万个,占用内存极少
  • 平台线程: 受限于系统资源,通常只能创建几千个

性能提升

通过性能测试对比,虚拟线程在高并发场景下表现优异:

  • 处理 10,000 个并发请求时,虚拟线程平均耗时更少
  • 内存占用显著降低
  • 上下文切换开销极小

🎯 核心功能演示

1. 异步任务执行

@Service public class TaskService { public void executeAsyncTask() { executorHolder.submitTask(() -> { log.info("异步任务开始执行,线程:{}, 是否为虚拟线程:{}", Thread.currentThread().getName(), Thread.currentThread().isVirtual()); // 执行任务... }); } }

2. 虚拟线程配置

@Configuration public class VirtualThreadConfig { @Bean public SimpleAsyncTaskSchedulerCustomizer simpleAsyncTaskSchedulerCustomizer() { return taskScheduler -> { taskScheduler.setVirtualThreads(true); taskScheduler.setThreadNamePrefix("virtual-scheduler-"); }; } }

3. Socket 通信示例

项目包含基于虚拟线程的 Socket 服务器和客户端演示:

  • 服务器使用虚拟线程处理每个客户端连接
  • 客户端创建大量虚拟线程进行并发测试

🔍 最佳实践

1. 不要池化虚拟线程

虚拟线程非常轻量,应该为每个任务创建新的虚拟线程:

// ✅ 正确做法 try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) { executor.submit(task); } // ❌ 错误做法 - 不要池化虚拟线程 ExecutorService executor = Executors.newFixedThreadPool(10);

2. 使用信号量控制并发

当需要限制对某些资源的并发访问时,使用信号量而不是线程池大小:

Semaphore sem = new Semaphore(10); // 在任务执行前获取许可 sem.acquire(); try { // 执行任务 } finally { // 任务完成后释放许可 sem.release(); }

3. 监控和调试

  • 使用有意义的线程名称前缀便于调试
  • 记录线程类型信息(虚拟线程 vs 平台线程)
  • 使用 Spring Boot Actuator 监控应用性能

📚 相关资源