虚拟线程

什么是虚拟线程

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

在平时的开发过程中,我们所使用的多线程往往意味着平台线程。平台线程代表着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

 

posted @ 2024-03-31 18:44  ryelqy  阅读(106)  评论(0编辑  收藏  举报