一个基于 Spring Boot 3.3.3 和 Java 21 的虚拟线程技术演示项目,展示了虚拟线程的各种应用场景和性能优势。
通过性能测试对比,虚拟线程在高并发场景下表现优异:
@Service
public class TaskService {
public void executeAsyncTask() {
executorHolder.submitTask(() -> {
log.info("异步任务开始执行,线程:{}, 是否为虚拟线程:{}",
Thread.currentThread().getName(),
Thread.currentThread().isVirtual());
// 执行任务...
});
}
}
@Configuration
public class VirtualThreadConfig {
@Bean
public SimpleAsyncTaskSchedulerCustomizer simpleAsyncTaskSchedulerCustomizer() {
return taskScheduler -> {
taskScheduler.setVirtualThreads(true);
taskScheduler.setThreadNamePrefix("virtual-scheduler-");
};
}
}
项目包含基于虚拟线程的 Socket 服务器和客户端演示:
虚拟线程非常轻量,应该为每个任务创建新的虚拟线程:
// ✅ 正确做法
try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
executor.submit(task);
}
// ❌ 错误做法 - 不要池化虚拟线程
ExecutorService executor = Executors.newFixedThreadPool(10);
当需要限制对某些资源的并发访问时,使用信号量而不是线程池大小:
Semaphore sem = new Semaphore(10);
// 在任务执行前获取许可
sem.acquire();
try {
// 执行任务
} finally {
// 任务完成后释放许可
sem.release();
}