程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

Java 21 虚拟线程主要概念简述(java虚拟机线程和真正的线程)

balukai 2025-04-01 15:56:35 文章精选 6 ℃

新的虚拟线程创建成本和销毁成本都是非常低廉的,因为它不是传统的跟平台线程一对一,而是多对一的,所以节约了很多cpu资源,减少了cpu调度带来的吞吐量降低。

它主要有3个概念

调度器

它利用ForkJoinPool in first-in-first-out (FIFO)做为调度器,这个ForkJoinPool是跟parallel streams中的common pool是不一样的.

下面是它的可配置属性定义

private static ForkJoinPool createDefaultScheduler() { 
  // Omissis int parallelism, maxPoolSize, minRunnable; 
  String parallelismValue = System.getProperty("jdk.virtualThreadScheduler.parallelism"); 
  String maxPoolSizeValue = System.getProperty("jdk.virtualThreadScheduler.maxPoolSize"); 
  String minRunnableValue = System.getProperty("jdk.virtualThreadScheduler.minRunnable"); 
 
}

可以通过修改这些属性值,对调度器进行调优。其中parallelismValue是并行度的意思,默认是取自Runtime.getRuntime().availableProcessors();,其它两个值的默认值计算方式如下,

maxPoolSize = Integer.max(parallelism, 256);

minRunnable = Integer.max(parallelism / 2, 1);

载体线程(carrier thread)

这操作系统调度平台线程,但虚拟线程是由jdk调度的,jdk给虚拟线程分配执行虚拟线程的平台线程的过程,叫挂载,取消分配叫卸载。

在这里平台线程有个特别的称呼载体线程(carrier thread),实际上虚拟线程和载体线程是相互不可见的,栈和线程本地变量是完全独立的。


未挂载的虚拟线程则存放在堆上,挂载后,会拷贝到栈上。

Continuation(延续)

为程序流程(函数)提供了运行,暂停/继续 (yield/resume)的能力.虚拟线程包含了许多的状态。从网上找了一个很详细的状态流转图

当状态是绿色的时候,虚拟线程已经是被挂载到carrier thread上了,这蓝色的状态,表明已经从carrier thread上做了卸载。紫色是已经绑定上了carrier thread。红色代表状态终止。Continuation的run,park,yield将产生这些状态。

Tags:

最近发表
标签列表