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

2023年 12月 20日 51.4k 0

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

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论