• JDK21的虚拟线程是什么?和平台线程什么关系?


    虚拟线程(Virtual Thread)是 JDK 而不是 OS 实现的轻量级线程(Lightweight Process,LWP),由 JVM 调度。许多虚拟线程共享同一个操作系统线程,虚拟线程的数量可以远大于操作系统线程的数量。

    在引入虚拟线程之前,java.lang.Thread 包已经支持所谓的平台线程,也就是没有虚拟线程之前,我们一直使用的线程。JVM 调度程序通过平台线程(载体线程)来管理虚拟线程,一个平台线程可以在不同的时间执行不同的虚拟线程(多个虚拟线程挂载在一个平台线程上),当虚拟线程被阻塞或等待时,平台线程可以切换到执行另一个虚拟线程。

    虚拟线程、平台线程和系统内核线程的关系图如下所示(图源:How to Use Java 19 Virtual Threads):

    关于平台线程和系统内核线程的对应关系多提一点:在 Windows 和 Linux 等主流操作系统中,Java 线程采用的是一对一的线程模型,也就是一个平台线程对应一个系统内核线程。Solaris 系统是一个特例,HotSpot VM 在 Solaris 上支持多对多和一对一。具体可以参考 R 大的回答: JVM 中的线程模型是用户级的么?

    相比较于平台线程来说,虚拟线程是廉价且轻量级的,使用完后立即被销毁,因此它们不需要被重用或池化,每个任务可以有自己专属的虚拟线程来运行。虚拟线程暂停和恢复来实现线程之间的切换,避免了上下文切换的额外耗费,兼顾了多线程的优点,简化了高并发程序的复杂,可以有效减少编写、维护和观察高吞吐量并发应用程序的工作量。

    虚拟线程在其他多线程语言中已经被证实是十分有用的,比如 Go 中的 Goroutine、Erlang 中的进程。

    知乎有一个关于 Java 19 虚拟线程的讨论,感兴趣的可以去看看:https://www.zhihu.com/question/536743167

    Java 虚拟线程的详细解读和原理可以看下面这几篇文章:

    虚拟线程在 Java 19 中进行了第一次预览,由JEP 425提出。JDK 20 中是第二次预览,做了一些细微变化,这里就不细提了。

    最后,我们来看一下四种创建虚拟线程的方法:

    // 1、通过 Thread.ofVirtual() 创建
    Runnable fn = () -> {
      // your code here
    };
    
    Thread thread = Thread.ofVirtual(fn)
                          .start();
    
    // 2、通过 Thread.startVirtualThread() 、创建
    Thread thread = Thread.startVirtualThread(() -> {
      // your code here
    });
    
    // 3、通过 Executors.newVirtualThreadPerTaskExecutor() 创建
    var executorService = Executors.newVirtualThreadPerTaskExecutor();
    
    executorService.submit(() -> {
      // your code here
    });
    
    class CustomThread implements Runnable {
      @Override
      public void run() {
        System.out.println("CustomThread run");
      }
    }
    
    //4、通过 ThreadFactory 创建
    CustomThread customThread = new CustomThread();
    // 获取线程工厂类
    ThreadFactory factory = Thread.ofVirtual().factory();
    // 创建虚拟线程
    Thread thread = factory.newThread(customThread);
    // 启动线程
    thread.start(); 
    

    通过上述列举的 4 种创建虚拟线程的方式可以看出,官方为了降低虚拟线程的门槛,尽力复用原有的 Thread 线程类,这样可以平滑的过渡到虚拟线程的使用。

    本文已收录今 JavaGuide (「Java学习 + 面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识)


    __EOF__

  • 本文作者: JavaGuide
  • 本文链接: https://www.cnblogs.com/javaguide/p/17770006.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    人工智能、深度学习、机器学习书目推荐
    当你认为Python程序慢时,几个方法你使用了吗
    网络工程师进阶课:华为HCIP认证课程介绍
    基于Spring实现策略模式
    clock gating
    一篇文章学会C#的正则表达式
    机器人中的数值优化(二十一)—— 伴随灵敏度分析、线性方程组求解器的分类和特点、优化软件
    vue创建色带组件。
    LVGL移植
    self-XSS漏洞SRC挖掘
  • 原文地址:https://www.cnblogs.com/javaguide/p/17770006.html