高端网站设计 | 门户网站设计:兰亭妙微 UI 设计赋能中国科协,让科技期刊集群 “破圈发光”
2026/1/15 15:31:25
虚拟线程(Project Loom 核心特性)自 Java 19 预览、Java 21 正式发布后,Java 25 并未新增颠覆性功能,而是聚焦调度优化、稳定性提升、场景适配,让虚拟线程在生产环境中更易用、更高效。
Thread.VirtualThreadSchedulerHint枚举,可通过Thread.ofVirtual().schedulerHint(hint).start()为虚拟线程指定调度优先级(如 IO 密集型、CPU 密集型),JVM 会针对性调度。jstack、jcmd可更清晰区分虚拟线程和平台线程,输出虚拟线程的调度状态(如 “等待 IO”“抢占中”);ThreadLocal的冲突:解决 Java 21 中部分场景下ThreadLocal内存泄漏问题,虚拟线程终止时会立即清理绑定的ThreadLocal数据;synchronized锁时,不再阻塞整个载体线程,而是暂时让出载体线程给其他虚拟线程执行;Thread#suspendVirtual()和Thread#resumeVirtual()方法(仅对虚拟线程生效),安全控制虚拟线程执行状态(平台线程的suspend()仍标记为废弃)。java
运行
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) // 指定IO密集型 .unstarted(() -> { // 模拟IO操作(如网络请求、文件读写) try { Thread.sleep(1000); // 虚拟线程sleep不会阻塞载体线程 System.out.println("IO任务完成:" + Thread.currentThread()); } catch (InterruptedException e) { throw new RuntimeException(e); } }); // 2. 创建CPU密集型虚拟线程 Thread cpuVirtualThread = Thread.ofVirtual() .schedulerHint(Thread.VirtualThreadSchedulerHint.CPU_BOUNDED) .unstarted(() -> { // 模拟CPU密集计算 long sum = 0; for (long i = 0; i < 1_000_000_000; i++) { sum += i; } System.out.println("CPU任务完成,sum=" + sum); }); // 启动虚拟线程 ioVirtualThread.start(); cpuVirtualThread.start(); // 等待完成 ioVirtualThread.join(); cpuVirtualThread.join(); // 3. 线程池方式(推荐生产环境使用) try (var executor = Executors.newVirtualThreadPerTaskExecutor()) { // 批量提交1000个虚拟线程任务 for (int i = 0; i < 1000; i++) { int taskId = i; executor.submit(() -> { Thread.sleep(500); System.out.println("批量任务" + taskId + "完成,线程:" + Thread.currentThread()); }); } } // 自动关闭线程池 } }java
运行
public class VirtualThreadSuspendDemo { public static void main(String[] args) throws InterruptedException { Thread vt = Thread.ofVirtual().start(() -> { while (!Thread.currentThread().isInterrupted()) { System.out.println("虚拟线程运行中..."); try { Thread.sleep(500); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }); // 运行2秒后暂停 Thread.sleep(2000); vt.suspendVirtual(); // 暂停虚拟线程 System.out.println("虚拟线程已暂停"); // 3秒后恢复 Thread.sleep(3000); vt.resumeVirtual(); // 恢复虚拟线程 System.out.println("虚拟线程已恢复"); // 2秒后中断 Thread.sleep(2000); vt.interrupt(); vt.join(); System.out.println("虚拟线程已终止"); } }synchronized锁持有超 1 秒、死循环),否则仍会占用载体线程;jdk.virtualThreads.activeCount(活跃虚拟线程数)、jdk.virtualThreads.schedulingDelay(调度延迟),避免调度瓶颈;