根据https://en.wikipedia.org/wiki/Green_thread,* 绿色线程 * 已在Java 1.1中实现,并在后续的Java版本中被删除。
Java 19引入了 * 虚拟线程 * 作为预览特性。https://openjdk.org/jeps/425
这两个线程似乎都在用户空间工作,而不是像Java本地线程那样在内核空间工作。
它们之间有什么区别?新的虚拟线程是否忽略了绿色线程以前的限制?
根据https://en.wikipedia.org/wiki/Green_thread,* 绿色线程 * 已在Java 1.1中实现,并在后续的Java版本中被删除。
Java 19引入了 * 虚拟线程 * 作为预览特性。https://openjdk.org/jeps/425
这两个线程似乎都在用户空间工作,而不是像Java本地线程那样在内核空间工作。
它们之间有什么区别?新的虚拟线程是否忽略了绿色线程以前的限制?
1条答案
按热度按时间zkure5ic1#
简短答案:
绿色线程与操作系统线程具有N:1Map。所有绿色线程都在单个操作系统线程上运行。使用虚拟线程,多个虚拟线程可以在多个本机线程上运行(n:mMap)
JEP 425的更多细节
只是一个小概述
| 螺纹类型|项目名称|Map(Java线程类型:本机线程)|
| - -|- -|- -|
| 平台线程|只是操作系统线程的 Package 器。|一比一|
| 绿色线程|在单个操作系统线程上运行多个“绿色线程”。|1:无|
| 虚拟线程|在多个操作系统线程上运行多个虚拟线程|N:M(N〈M)|
来自JEP的完整报价
虚拟线程是由JDK而不是OS提供的线程的轻量级实现。它们是用户模式线程的一种形式,在其他多线程语言中已获得成功(例如Go语言中的goroutines和Erlang中的processes)。在Java的早期版本中,用户态线程甚至被称为“绿色线程”,那时操作系统线程还没有成熟和普及。然而,Java的绿色线程都共享一个操作系统线程(M:1调度),最终被平台线程超越,平台线程被实现为操作系统线程的 Package 器(1:1调度)。虚拟线程采用M:N调度,其中大量(M)虚拟线程被调度为在较少(N)操作系统线程上运行。