Discuss / Java / 虚拟线程具体是由什么线程调度的问题

虚拟线程具体是由什么线程调度的问题

Topic source

大风起兮

#1 Created at ... [Delete] [Delete and Lock User]

> 直接调用start()实际上是由ForkJoinPool的线程来调度的。我们也可以自己创建调度线程,然后运行虚拟线程

这里好像有点问题,我看了这个方法的源码

Executors.newVirtualThreadPerTaskExecutor();

它本质上使用的是

Thread.ofVirtual().factory()

来为每一个任务创建一个虚拟线程

其中的schedule默认是null,仍然是使用ForkJoinPool的线程来进行调度

API里并没有找到对外暴露的,可以自己创建调度线程的方法

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

Executors.newVirtualThreadPerTaskExecutor()

廖雪峰

#3 Created at ... [Delete] [Delete and Lock User]

它用的是new ThreadPerTaskExecutor()

大风起兮

#4 Created at ... [Delete] [Delete and Lock User]

它没有使用ThreadPerTaskExecutor

平台线程的ThreadPerTaskExecutor,创建的api是这样的

public static ExecutorService newThreadPerTaskExecutor(ThreadFactory threadFactory)

要求传递一个ThreadFactory来为每个任务创建一个线程

newVirtualThreadPerTaskExecutor

使用的Factory是

Thread.ofVirtual().factory()

用这个工厂为每个任务创建一个虚拟线程

这些虚拟线程底层使用的平台线程仍然来自于ForkJoinPool

在虚拟线程里打印 Thread.currentThread(),可以看到 VirtualThread[#204]/runnable@ForkJoinPool-1-worker-9

我看了一圈,并没有找到真正能修改虚拟线程基于的平台线程的api,可能是JDK不允许自主修改平台线程


  • 1

Reply