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

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

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

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

图片图片

虚拟线程使用

虚拟线程的创建方式,主要有以下 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. 普通线程默认创建的是用户线程(而守护线程),而虚拟线程是守护线程,并且其守护线程的属性不能被修改,如果修改就会报错,如下图所示:

图片图片

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

小结

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

责任编辑:武晓燕 来源: Java中文社群
相关推荐

2022-07-06 13:48:24

RedisSentinel机制

2023-12-06 09:10:28

JWT微服务

2021-02-19 10:02:57

HTTPSJava安全

2020-12-23 13:29:15

微服务架构面试官

2021-09-07 10:44:33

Java 注解开发

2021-12-28 09:50:18

Redis单线程高并发

2024-02-04 10:29:58

线程通信

2022-01-24 07:01:20

安全多线程版本

2023-11-03 12:29:48

Java虚拟线程

2023-09-27 23:03:01

Java虚拟线程

2022-03-02 07:36:37

池化技术Java线程池

2024-02-22 15:36:23

Java内存模型线程

2021-12-08 06:53:29

面试动态代理

2021-01-15 07:23:09

Java线程操作系统

2024-01-11 08:12:20

重量级监视器

2022-09-29 07:30:57

数据库索引字段

2020-10-24 15:50:54

Java值传递代码

2019-05-14 08:44:13

面试面试官线程安全

2021-04-25 09:36:20

Go协程线程

2021-01-21 07:53:29

面试官Promis打印e
点赞
收藏

51CTO技术栈公众号