新的虚拟线程创建成本和销毁成本都是超级低廉的,由于它不是传统的跟平台线程一对一,而是多对一的,所以节约了许多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将产生这些状态。















暂无评论内容