绿色线程和虚拟线程有什么区别?

cyn*_*nox 39 java multithreading

根据https://en.wikipedia.org/wiki/Green_thread 的说法,绿色线程已在 Java 1.1 中实现,并在后续 Java 版本中被删除。

Java 19 引入了虚拟线程作为预览功能。 https://openjdk.org/jeps/425

这两个线程似乎都在用户空间中工作,而不是像 Java 本机线程那样在内核空间中工作。

它们之间有什么区别?新的虚拟线程是否消除了绿色线程之前的限制?

Reg*_*Reg 48

简短回答:

绿色线程与操作系统线程具有 N:1 映射。所有绿色线程都在单个操作系统线程上运行。通过虚拟线程,多个虚拟线程可以在多个本机线程上运行(n:m 映射)

JEP 425的更多细节

  • Java 的绿色线程都共享一个操作系统线程(M:1 调度),最终被作为操作系统线程包装器实现的平台线程(Java 的本机线程)超越(1:1 调度)

  • 虚拟线程采用 M:N 调度,其中大量 (M) 虚拟线程被调度在较少数量 (N) 的操作系统线程上运行。

只是一个小概述

螺纹类型 描述 Java 线程类型 (M) : 本机线程 (N)
平台线程 操作系统线程的包装器。 1:1
绿色线程 在单个操作系统线程上运行多个“绿色线程”。 中号:1
虚拟线程 在多个操作系统线程上运行多个虚拟线程 M:N (M > N)

JEP 的完整报价

虚拟线程是 JDK 而不是操作系统提供的轻量级线程实现。它们是用户模式线程的一种形式,在其他多线程语言中已经取得了成功(例如,Go 中的 goroutine 和 Erlang 中的进程)。在 Java 的早期版本中,当操作系统线程尚未成熟和广泛使用时,用户模式线程甚至被称为所谓的“绿色线程”。然而,Java 的绿色线程都共享一个操作系统线程(M:1 调度),并且最终被作为操作系统线程包装器实现的平台线程所超越(1:1 调度)。虚拟线程采用 M:N 调度,其中大量 (M) 虚拟线程被调度在较少数量 (N) 的操作系统线程上运行。