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

39
根据 https://en.wikipedia.org/wiki/Green_thread,Java 1.1 实现了 Green Threads,但在后续的 Java 版本中被删除。
Java 19 推出了 Virtual Threads 作为预览功能。详见 https://openjdk.org/jeps/425
两种线程似乎都在用户空间而非内核空间运行,与 Java 的 Native Threads 不同。
它们之间有什么区别?新的 Virtual Threads 是否克服了 Green Threads 的先前限制?
2个回答

47

简短回答:

绿色线程与操作系统线程是 N:1 映射关系。所有的绿色线程都在一个单独的操作系统线程上运行。虚拟线程可以在多个本地线程上运行(n:m 映射)。

JEP 425的更多细节:

  • Java 的绿色线程都共享一个操作系统线程(M:1 调度),最终被实现为操作系统线程包装器的平台线程(Java 的原生线程)取得了胜利(1:1 调度)。

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

简要概述:

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

JEP 的全文摘录:

虚拟线程是 JDK 提供的一种轻量级线程实现,而不是操作系统提供的。它们是一种用户模式下的线程,具有与内核线程相同的执行特性,但不需要为每个线程分配内核数据结构。虚拟线程通常由用户代码访问,这使得它们可以用于高层次的应用程序并发结构,例如协作式任务处理和事件驱动编程。虚拟线程可以通过 M:N 调度来映射到底层的 OS 线程。

线程在其他多线程语言中已经得到成功应用,例如Go语言中的goroutines和Erlang中的进程。用户态线程甚至在Java早期版本中作为所谓的“绿色线程”出现,当时操作系统线程还没有成熟和普及。然而,Java的绿色线程都共享一个操作系统线程(M:1调度),最终被实现为包装器的平台线程(1:1调度)取代了。虚拟线程采用M:N调度,在较少的操作系统线程(N)上安排大量(M)的虚拟线程运行。

非常好的帖子,谢谢!然而,我对Thread实例和JVM线程之间的映射感到困惑:当创建一个Thread对象时,是立即创建一个JVM,还是只有在调用start()方法时才创建?我刚刚发布了一个关于此的问题,如果你能帮忙解答,那就太棒了 :) 非常感谢! - undefined
非常好的帖子,谢谢!但是我对Thread实例和JVM线程之间的映射感到很困惑:当创建一个Thread对象时,是立即创建一个JVM还是只有在调用start()方法时才创建?我刚刚发布了一个关于此问题的问题,如果你能帮忙解答就太棒了 :) 非常感谢!! - morgwai

-1
Java的Green Threads共享一个操作系统线程(M:1调度),最终被平台线程(Java的本地线程)所取代,这些本地线程是OS线程(1:1调度)的包装实现。虚拟线程采用M:N调度,在较少的OS线程上安排运行大量(M)的虚拟线程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接