首页 > 其他分享 >面试官:什么是虚拟线程?为什么要有虚拟线程?

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

时间:2023-12-24 18:35:10浏览次数:33  
标签:面试官 Thread 创建 普通 虚拟 线程 轻量级

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

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

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

小结

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


标签:面试官,Thread,创建,普通,虚拟,线程,轻量级
From: https://blog.51cto.com/vipstone/8956389

相关文章

  • [已解决] KVM 显卡直通 (GPU-passthrough) 直通虚拟机关机后 显示屏黑屏
    系统环境██████████████████████████littleblacklb@lb-desktop██████████████████████████------------------------██████████████████████████OS:ManjaroLinuxx86_64......
  • CPP创建子线程
     #include<iostream>#include<thread>usingnamespacestd;structMyStruct{inta=0;strings="abc雷";};//线程入口voidproc(MyStruct&a){for(intm=0;m<50;m++){if(a.a==0)......
  • 子线程和中断的比较
    子线程是在主线程之外创建的线程。与主线程相比,子线程通常用于执行耗时的任务,以避免阻塞主线程的运行。子线程可以同时运行多个,并且可以进行多任务处理。子线程的运行状态包括:新建状态、就绪状态、运行状态、阻塞状态和死亡状态。子线程的启动可以通过start()方法来实现,并且可以通......
  • JVM虚拟机系统性学习-JVM调优实战之内存溢出、高并发场景调优
    调优实战-内存溢出的定位与分析首先,对于以下代码如果造成内存溢出该如何进行定位呢?通过jmap与MAT工具进行定位分析代码如下:publicclassTestJvmOutOfMemory{publicstaticvoidmain(String[]args){List<Object>list=newArrayList<>();for(int......
  • Java多线程​(三)线程安全:同步及锁
    线程安全问题考虑如下情景:某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票。publicclassTicketSellerextendsThread{//定义票的数量staticintticket=0;//取值范围:0~99@Overridepublicvoidrun(){while(true){......
  • qemu 虚拟机
    文章目录一、参考资料二、QEMU调试参数三、QEMU命令一、参考资料#查询qemu包aptlist|grepqemu#查询已安装的qemu包aptlist--installed|grepqemu#查询qemu版本qemu-img-V#安装sudoapt-getinstallqemu-system-armqemu-system-mipsqemu-syste......
  • Android自定义View面试官最爱问的12个高级问题
    引言在Android开发领域,自定义View是一个考察开发者深度功底和创造力的重要方面。本文将从Android面试官的角度出发,深入探讨自定义View面试中常见的12个高级疑难问题,帮助大家更好地准备面试,展示专业技能。自定义View的基础知识问题:请解释自定义View的基本概念及其在Android开发中的......
  • 手机平板远程访问kvm虚拟机的windows
    title:手机平板远程访问kvm虚拟机的windowsbanner_img:https://cdn.studyinglover.com/pic/2023/12/5c4ffb4ee8500a9cdfa2406137e5e0a8.jpgdate:2023-12-2319:28:00tags:-踩坑手机平板远程访问kvm虚拟机的windows最近快期末周了,开始陆陆续续开始复习(预习)这学期的课,......
  • 虚拟化
    在Windows上,DockerDesktop使用Hyper-V作为默认的虚拟化技术。要使用DockerDesktop,你需要满足以下要求:-Windows10Enterprise、Professional或Education版本(64位)-64位的处理器,支持SecondLevelAddressTranslation(SLAT)-BIOS中启用了虚拟化技术(IntelVT-x或AMD-V)如果你的......
  • 【小沐学CAD】虚拟仿真开发工具:GL Studio(功能)
    1、简介https://disti.com/gl-studio/https://ww2.mathworks.cn/products/connections/product_detail/gl-studio.htmlDiSTI是HMI软件、虚拟驾驶舱、仪表、信息娱乐、集群显示器和嵌入式UI解决方案的领先提供商。GLStudio是HMI&UI/UXDesignSoftware。2、软件功能......