面试官:什么是虚拟线程?为什么要有虚拟线程?

fbd9c9fd4c102d2e106500db6e0f0ca3.png

本文内容已收录至我的面试网站:www.javacn.site

Java 中的虚拟线程,也叫做协程或“轻量级线程”,它诞生于 JDK 19(预览 API),正式发布于 JDK 21,它是一种在 Java 虚拟机(JVM)层面实现的逻辑线程,不直接和操作系统的物理线程一一对应,因此它可以减少上下文切换所带来的性能开销。

操作系统线程、普通线程(Java 线程)和虚拟线程的关系如下:7511c0171527f06c08ec810d67a34848.png

虚拟线程使用

虚拟线程的创建方式,主要有以下 4 种:

  1. Thread.startVirtualThread(Runnable task)

  2. Thread.ofVirtual().unstarted(Runnable task)

  3. Thread.ofVirtual().factory()

  4. 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 普通线程

虚拟线程和普通线程的区别主要体现在以下几点:

  1. 普通线程是和操作系统的物理线程是一一对应的,而虚拟线程是 JVM 层面的逻辑线程,并不和操作系统的物理线程一一对应,它可以看作是轻量级的线程。

  2. 普通线程默认创建的是用户线程(而守护线程),而虚拟线程是守护线程,并且其守护线程的属性不能被修改,如果修改就会报错,如下图所示:

3962ee4de313db034a4ebbbad1612c66.png
  1. 虚拟线程由 JVM 调度和使用,避免了普通线程频繁切换的性能开销,所以相比于普通的线程来说,运行效率更高。

小结

线程是轻量级的进程,而虚拟线程则是轻量级的线程,虚拟线程是 JVM 层面实现的逻辑线程,不直接和操作系统的物理线程一一对应,因此使用它可以减少线程上下文切换所带来的性能开销。它和普通线程的线程类型也不同,普通线程是默认是用户线程类型,而虚拟线程则是守护线程(而且不能被修改)。


说件大事

磊哥一直在做的事,为了让大家找到更好的工作,所以有着 13 年工作经验的我,开发了一门《Java 面试突击训练营》。

整个课程为期一个月,带着大家把 16 万的图文 + 3000 多分钟的视频课系统的学完,并且录屏支持永久更新和观看。 

整个课程从 Java 基础到微服务 Spring Cloud 应用尽有,包含以下 16 个大的模块:

225c5793ed609deaedac5abb8bd0793d.png

训练营带你高效的搞定面试问题,学完之后可以应对当前市面上绝大部分公司的面试,得到高薪 Offer。

加我微信咨询吧:GG_Stone【备注:训练营】

bf9b8e5d1af84f416496545a3cdc19d9.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sufu1065

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值