首页 > 其他分享 >虚拟线程

虚拟线程

时间:2024-03-31 18:56:45浏览次数:24  
标签:Thread customThread CustomThread 虚拟 线程 public

什么是虚拟线程

首先,我们需要了解什么是虚拟线程。

在平时的开发过程中,我们所使用的多线程往往意味着平台线程。平台线程代表着JVM直接与操作系统交互,创建了一个一个的线程,并且在JVM中还要为这个线程单独开辟内存使用。一般在JVM中创建一个平台线程,开销大约在1M左右。为了避免创建线程和销毁线程带来的巨大开销,我们通常选择使用池化技术来维护一些活跃的线程。

此外,线程的数量也需要严格控制。如果在一个线程池中维护成千上百个线程,往往效率并不尽如人意。因为线程在切换时涉及到CPU上下文的切换,如果线程数过多,反而会降低执行效率。因此,如何控制线程池的大小也是考验工程师经验的难点。

平台线程与系统线程关系如下

 

为了解决这个问题,虚拟线程应运而生,虚拟线程并不是Java的首创,它在很多其他语言中被称为协程、纤程、绿色线程、用户态线程等,虚拟线程相对平台线程,并不直接与操作系统交互,虚拟线程的数据是维护在堆内存中,由JVM创建的平台线程来持有,由平台线程来决定什么时候来切换虚拟线程,大概图如下

 

 

虽然图中只画了几个虚拟线程,但是在实际使用中,我们可以创建成百上千的虚拟线程而不用担心资源消耗的问题

首先原因在于虚拟线程的开销极其廉价,一个虚拟线程可能才使用几百字节,所以几遍创建成百上千也不会消耗太多内存资源

其次虽然我们有极多的虚拟线程,但是实际上执行线程依旧只有几个平台线程,所以在线程使用中不会由于CPU上下文的切换导致的额外开销。

 

虚拟线程的使用

官方提供了以下四种方式创建虚拟线程:

  1. 使用 Thread.startVirtualThread() 创建
  2. 使用 Thread.ofVirtual() 创建
  3. 使用 ThreadFactory 创建

3.1 使用 Thread.startVirtualThread() 创建

public class VirtualThreadTest {
  public static void main(String[] args) {
    CustomThread customThread = new CustomThread();
    Thread.startVirtualThread(customThread);
  }
}

static class CustomThread implements Runnable {
  @Override
  public void run() {
    System.out.println("CustomThread run");
  }
}

3.2 使用 Thread.ofVirtual()创建

public class VirtualThreadTest {
  public static void main(String[] args) {
    CustomThread customThread = new CustomThread();
    // 创建不启动
    Thread unStarted = Thread.ofVirtual().unstarted(customThread);
    unStarted.start();
    // 创建直接启动
    Thread.ofVirtual().start(customThread);
  }
}
static class CustomThread implements Runnable {
  @Override
  public void run() {
    System.out.println("CustomThread run");
  }
}

3.3 使用 ThreadFactory 创建

public class VirtualThreadTest {
  public static void main(String[] args) {
    CustomThread customThread = new CustomThread();
    ThreadFactory factory = Thread.ofVirtual().factory();
    Thread thread = factory.newThread(customThread);
    thread.start();
  }
}

static class CustomThread implements Runnable {
  @Override
  public void run() {
    System.out.println("CustomThread run");
  }
}

很遗憾,上述3种方法并没有经过本机的检验,目前还找不到原因

---------------------------------------------------------------------------------------------

以下方法经过本机检验:

public class VirtualThreadTest {

    public static void main(String[] args) {
        CustomThread customThread = new CustomThread();
        Thread.startVirtualThread(customThread).start();
    }

    static class CustomThread implements Runnable {
        @Override
        public void run() {
            System.out.println("CustomThread run");
        }
    }
}

 

运行效果:

 

Reference

[1] 听到微笑,Java21新特性-虚拟线程,https://blog.csdn.net/tianjindong0804/article/details/135046271

[2] 翟睿,浅析Java中的虚拟线程,https://www.jb51.net/program/3029905sw.htm

 

标签:Thread,customThread,CustomThread,虚拟,线程,public
From: https://www.cnblogs.com/ryelqy/p/18107074

相关文章

  • 操作系统引导和虚拟机
    操作系统引导安装操作系统后:C盘(是这个磁盘的活动分区,安装了操作系统)主存主存由RAM和ROM组成,ROM(BIOS)包含:ROM引导程序,即自举程序断电后,RAM会消失,但是ROM不会整个开机过程:CPU通电,找到ROM执行引导程序,然后引导磁盘里的主引导记录(读入RAM),判断C盘位置,然后把C盘的引导记录......
  • C++单例类和线程的一个结合
    一个C++的单例类,类里面定义了一个线程对象,线程对象会定时去计算一个时间,并返回这个计算出来的时间。 应用场景:比如,有些比较消耗时间的操作,就可以放在线程里面定时计算,我们在外部定时读取。这样就可以避免主线程被阻塞。 #include<iostream>#include<thread>#incl......
  • Java多线程三种实现方式
    一、继承Thread方法publicclassMyThreadextendsThread{@Overridepublicvoidrun(){for(inti=0;i<10;i++){System.out.println(getName()+"输出内容");}}publicstaticvoidmain(String[]args){......
  • 详解 Java多线程带来的的风险-线程安全
    目录一、什么是线程安全? 二、线程不安全的原因1、线程调度是随机的2、修改共享数据:多个线程修改同⼀个变量3、原⼦性 ​编辑(1)什么是原⼦性(2)⼀条java语句不⼀定是原⼦的,也不⼀定只是⼀条指令 (3)不保证原⼦性会给多线程带来什么问题(4)可⻅性:可⻅性指,⼀个线程对共......
  • 并发线程基础第六篇
    目录共享模型之无锁CAS与volatile举个例子CAS工作方式volatile为什么无锁效率高CAS的特点原子整数原子引用为什么需要原子引用类型?J.U.C并发包提供了: 比如上面取款的例子,我们这里把账户的类型改为小数BigDecimal类型ABA问题原子数组为什么要有原子数组......
  • 银行虚拟公户是什么,有什么作用?
    银行虚拟公户通常是指银行提供的一种在线虚拟账户服务,也被称为虚拟企业账户或电子账户。它是一种数字化的账户,没有实体卡片或支票簿,主要用于企业或机构进行在线支付、收款和资金管理等操作。银行虚拟公户的作用包括:1.方便快捷:虚拟公户可以在线开通和管理,无需前往银行柜台办理......
  • linux物理内存,虚拟内存的获取
    使用文件流的方式,解析   cat/proc/meminfo 文件里面的数据 #include<iostream>#include<fstream>#include<sstream>#include<string>#include<unordered_map>#include<map>structBASE_INFO_S{unsignedlonglongMemTot......
  • [os]Intel VT-x硬件虚拟化(vmx和vmcs)(1)
    IntelVT-x是Intel的虚硬件辅助拟化方案,TV的意思是VisualizationTechnology.硬件辅助虚拟化方案是系统虚拟化技术的一种,重要是用来弥补虚拟化漏洞.虚拟化漏洞虚拟化系统必须满足三个条件:资源控制:虚拟机对于物理资源的访问都应该在Hypervisor的监控下进行等价:上层应用与物理......
  • Java的心脏:深入解析Java虚拟机、进程与线程的精妙互动
    一、定义进程(Process)和线程(Thread)是操作系统中非常基础且重要的概念,它们对于理解程序的执行、资源分配和并发编程至关重要。我将从操作系统(OS)和Java编程语言的角度来详细解释这两个概念。从操作系统的角度进程:定义:进程是操作系统进行资源分配和调度的基本单位。它是一......
  • 使用Jep在Java中调用Conda虚拟环境下的Python
    为了解决毕设中需要用到在Java中调用Python的问题,我在网上寻找对应的解决方案。似乎没有太好的解决方案:Jython至今仍是Python2,Py4J似乎也不再活跃更新。所幸我找到了Jep这一神器。正当我雀跃不已,却又发现了一些问题,在两个小时的艰难攻关之下,这些问题逐渐迎刃而解。问题一:无法找到......