本文内容已收录至我的面试网站:www.javacn.site
Java 中的虚拟线程,也叫做协程或“轻量级线程”,它诞生于 JDK 19(预览 API),正式发布于 JDK 21,它是一种在 Java 虚拟机(JVM)层面实现的逻辑线程,不直接和操作系统的物理线程一一对应,因此它可以减少上下文切换所带来的性能开销。
操作系统线程、普通线程(Java 线程)和虚拟线程的关系如下:
虚拟线程使用
虚拟线程的创建方式,主要有以下 4 种:
Thread.startVirtualThread(Runnable task)
Thread.ofVirtual().unstarted(Runnable task)
Thread.ofVirtual().factory()
Executors.newVirtualThreadPerTaskExecutor()
具体示例如下。
1.startVirtualThread
创建虚拟线程,并直接启动执行任务:
// 创建并启动虚拟线程
Thread.startVirtualThread(() -> {
System.out.println("Do virtual thread.");
});
2.unstarted
只创建虚拟线程,但不直接启动:
// 创建虚拟线程
Thread vt = Thread.ofVirtual().unstarted(()->{
System.out.println("Do virtual thread.");
});
// 运行虚拟线程
vt.start();
3.factory
先创建虚拟线程工厂,然后再使用工厂创建虚拟线程,之后再调用 start() 方法进行执行:
// 创建虚拟线程工厂
ThreadFactory tf = Thread.ofVirtual().factory();
// 创建虚拟线程
Thread vt = tf.newThread(()->{
System.out.println("Do virtual thread.");
});
// 运行虚拟线程
vt.start();
4.newVirtualThreadPerTaskExecutor
使用线程池的方式创建虚拟线程:
// 创建一个支持虚拟线程的线程池
ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();
executor.submit(()->{
System.out.println("Do virtual thread.");
});
虚拟线程 VS 普通线程
虚拟线程和普通线程的区别主要体现在以下几点:
普通线程是和操作系统的物理线程是一一对应的,而虚拟线程是 JVM 层面的逻辑线程,并不和操作系统的物理线程一一对应,它可以看作是轻量级的线程。
普通线程默认创建的是用户线程(而守护线程),而虚拟线程是守护线程,并且其守护线程的属性不能被修改,如果修改就会报错,如下图所示:

虚拟线程由 JVM 调度和使用,避免了普通线程频繁切换的性能开销,所以相比于普通的线程来说,运行效率更高。
小结
线程是轻量级的进程,而虚拟线程则是轻量级的线程,虚拟线程是 JVM 层面实现的逻辑线程,不直接和操作系统的物理线程一一对应,因此使用它可以减少线程上下文切换所带来的性能开销。它和普通线程的线程类型也不同,普通线程是默认是用户线程类型,而虚拟线程则是守护线程(而且不能被修改)。
说件大事
磊哥一直在做的事,为了让大家找到更好的工作,所以有着 13 年工作经验的我,开发了一门《Java 面试突击训练营》。
整个课程为期一个月,带着大家把 16 万的图文 + 3000 多分钟的视频课系统的学完,并且录屏支持永久更新和观看。
整个课程从 Java 基础到微服务 Spring Cloud 应用尽有,包含以下 16 个大的模块:
训练营带你高效的搞定面试问题,学完之后可以应对当前市面上绝大部分公司的面试,得到高薪 Offer。
加我微信咨询吧:GG_Stone【备注:训练营】