首页 > 其他分享 >JDK21的虚拟线程是什么?和平台线程什么关系?

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

时间:2023-10-17 16:24:46浏览次数:38  
标签:JDK21 Java Thread 创建 平台 虚拟 线程

虚拟线程(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 程序员所需要掌握的核心知识)

标签:JDK21,Java,Thread,创建,平台,虚拟,线程
From: https://www.cnblogs.com/javaguide/p/17770006.html

相关文章

  • Windows Server 2016 OVF, updated Oct 2023 (sysin) - VMware 虚拟机模板
    WindowsServer2016OVF,updatedOct2023(sysin)-VMware虚拟机模板2023年10月版本更新,现在自动运行sysprep,支持ESXiHostClient部署请访问原文链接:https://sysin.org/blog/windows-server-2016-ovf/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org现在......
  • Windows Server 2019 OVF, updated Oct 2023 (sysin) - VMware 虚拟机模板
    WindowsServer2019OVF,updatedOct2023(sysin)-VMware虚拟机模板2023年10月版本更新,现在自动运行sysprep,支持ESXiHostClient部署请访问原文链接:https://sysin.org/blog/windows-server-2019-ovf/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgWind......
  • 在Matplotlib中使用多线程multiprocessing举例
    在Matplotlib中使用多线程Matplotlib提供了一些机制来支持多线程的使用,比如使用matplotlib.pyplot.switch_backend()方法指定可用的图形后端或使用matplotlib.figure.Figure对象的canvas属性来实现绘图。但是,这些机制都需要特别小心地管理和控制,否则会引发线程之间的数据竞争和访......
  • 使用Guava的ListenableFuture完成异步多线程任务并返回结果
    privatestaticExecutorServiceexecutors=newThreadPoolExecutor(5,20,0L,TimeUnit.MILLISECONDS,newLinkedBlockingQueue<Runnable>(10),newThreadFactoryBuilder().setNameFormat("抓数据线程-%d").build());publicstaticvoidmain(String[]arg......
  • 每天5分钟复习OpenStack(五)CPU虚拟化
    KVM虚拟化之CPU虚拟化存在是为了更高效的利用物理机的资源,而虚拟机技术主要是针对三大组件,分别是CPU虚拟化、存储虚拟化、网络虚拟化。下面我们分别介绍下三大组件的常用知识。CPU虚拟化1.1CPU虚拟化支持KVM的虚拟化是需要CPU硬件支持的。还记得我们在前面的章节讲过......
  • 使用mobaxterm连接kali虚拟机
    0x01首先需要开启root用户远程ssh登录服务1、先执行以下命令cd/etc/ssh//进入文件目录ls//查看文件2、编辑ssh_config配置文件vimssh_config找到其中#PasswordAuthenticationno去掉其注释,并将no改为yes然后按esc再:wq退出3、编辑sshd_config配置......
  • C++11手写线程池1
    线程池结构  任务队列结构体 保存一个回调函数指针和一个,参数指针 实现任务队列 为了多个生产者多个消费者取东西混乱的避免要加互斥锁线程池threadpool类要实现的初始化一个线城池参数是最小数和最大数   malloc和new的区别new要调用该类的构......
  • 虚拟机是什么
    简单地说,虚拟机(VirtualMachine)就是允许我们在当前操作系统中运行其他操作系统的软件,本质上和VS、QQ这些应用程序一样。所以,只要我们在电脑(PC或笔记本等)上安装好虚拟机软件,就可以模拟出来若干台相互独立的虚拟PC设备,每一个都如何一台真实的计算机。在此基础上,我们可以给每台虚......
  • Docker与虚拟机有何不同?
    内容来自DOChttps://q.houxu6.top/?s=Docker与虚拟机有何不同?我一直在反复阅读Docker文档,试图理解Docker和完整虚拟机之间的差异。它如何能够在不增加负担的情况下提供完整的文件系统、隔离的网络环境等?为什么将软件部署到Docker镜像(如果这是正确的术语)比简单地部署到一致的......
  • 打卡拍照替换_虚拟相机实时拍照替换
     在我们日常生活中,总有一些app要求我们到场实时拍照上传的要求,但因为种种原因无法到场,或者为了提高效率总要想一些能解决这个问题的办法,比如叫同事帮忙拍照上传等。今天我们开发了一款可以满足这个需求的插件,能够替换实时拍照上传的照片,使用简单便捷,新手也可以轻松使用。手机要......