一、Java 25 虚拟线程核心定位
虚拟线程(Project Loom 核心特性)自 Java 19 预览、Java 21 正式发布后,Java 25 并未新增颠覆性功能,而是聚焦调度优化、稳定性提升、场景适配,让虚拟线程在生产环境中更易用、更高效。
二、Java 25 虚拟线程的核心优化
1. 调度策略优化(核心改进)
- 问题背景:Java 21-24 中,虚拟线程默认采用'抢占式 + 协作式'混合调度,但在高并发 IO 场景下,部分虚拟线程可能因长时间占用载体线程(Carrier Thread)导致调度延迟。
- Java 25 优化:
- 引入自适应调度阈值:JVM 会根据系统负载(CPU/IO 使用率)动态调整虚拟线程的抢占阈值,避免单个虚拟线程长时间占用载体线程;
- 优化载体线程池复用:减少载体线程的创建 / 销毁开销,尤其在虚拟线程频繁创建 / 终止的场景下,CPU 使用率降低约 5%-10%(官方测试数据);
- 支持显式调度提示:新增
Thread.VirtualThreadSchedulerHint枚举,可通过Thread.ofVirtual().schedulerHint(hint).start()为虚拟线程指定调度优先级(如 IO 密集型、CPU 密集型),JVM 会针对性调度。
2. 调试与监控增强
- 完善 JDK 工具链支持:
jstack、jcmd可更清晰区分虚拟线程和平台线程,输出虚拟线程的调度状态(如'等待 IO''抢占中'); - 新增 MBean 监控指标:通过 JMX 可获取虚拟线程的创建总数、活跃数、调度延迟、载体线程利用率等核心指标,便于生产环境监控;
- 优化异常栈追踪:虚拟线程抛出异常时,栈轨迹会标注'VirtualThread'标识,且不再包含冗余的载体线程信息,定位问题更高效。
3. 兼容性与稳定性提升
- 修复虚拟线程与
ThreadLocal的冲突:解决 Java 21 中部分场景下ThreadLocal内存泄漏问题,虚拟线程终止时会立即清理绑定的ThreadLocal数据; - 优化虚拟线程与锁的交互:虚拟线程等待
synchronized锁时,不再阻塞整个载体线程,而是暂时让出载体线程给其他虚拟线程执行; - 支持虚拟线程的'暂停 / 恢复':新增
Thread#suspendVirtual()和Thread#resumeVirtual()方法(仅对虚拟线程生效),安全控制虚拟线程执行状态(平台线程的suspend()仍标记为废弃)。
三、Java 25 虚拟线程使用示例
1. 基础创建与调度提示
import java.util.concurrent.Executors;
public class VirtualThread25Demo {
public static void main(String[] args) throws InterruptedException {
// 1. 创建带调度提示的虚拟线程(IO 密集型)
Thread ioVirtualThread Thread.ofVirtual()
.schedulerHint(Thread.VirtualThreadSchedulerHint.IO_BOUNDED)
.unstarted(() -> {
{
Thread.sleep();
System.out.println( + Thread.currentThread());
} (InterruptedException e) {
(e);
}
});
Thread.ofVirtual()
.schedulerHint(Thread.VirtualThreadSchedulerHint.CPU_BOUNDED)
.unstarted(() -> {
;
( ; i < ; i++) {
sum += i;
}
System.out.println( + sum);
});
ioVirtualThread.start();
cpuVirtualThread.start();
ioVirtualThread.join();
cpuVirtualThread.join();
( Executors.newVirtualThreadPerTaskExecutor()) {
( ; i < ; i++) {
i;
executor.submit(() -> {
Thread.sleep();
System.out.println( + taskId + + Thread.currentThread());
});
}
}
}
}

