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

问题描述 投票:0回答:3

Green Threads 已在 Java 1.1 中实现,并在后续 Java 版本中被删除。 Java 19 引入了 虚拟线程

作为预览功能。

https://openjdk.org/jeps/425 两个线程似乎都在用户空间中工作,而不是像 Java 本机线程那样在内核空间中工作。

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

java multithreading
3个回答
49
投票

绿色线程与操作系统线程具有 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) 的操作系统线程上运行。

虚拟线程的重要部分不在于它们是多核的(对于服务器来说,核心数量显然不是IO瓶颈),而是所有阻塞操作都被转换为非阻塞操作,这些操作使用下面的epoll之类的东西引擎盖,后台有一个协调器线程运行一个事件循环,当虚拟线程等待的文件描述符准备就绪时,该事件循环会唤醒虚拟线程。

0
投票
相比之下,如果您使用旧的绿色线程对 IO 进行阻塞等待,则会强制

all

绿色线程等待。换句话说,旧的绿色线程并没有让 IO 变得容易,仍然迫使你手动异步编程,而虚拟线程的设计目的是让异步 IO 变得简单,就像 Go 的 goroutine 一样。

由于绿色线程不能用于同时等待许多事情,因此它们的性能优于平台线程,操作系统调度程序可以通过 IO 唤醒它们(以昂贵的上下文切换为代价)。不是因为是单线程,而是因为他们甚至无法同时等待很多事情。

Java 的绿色线程都共享一个操作系统线程(M:1 调度),最终被作为操作系统线程包装器实现的平台线程(Java 的本机线程)超越(1:1 调度) 虚拟线程采用 M:N 调度,其中大量线程数量 (M) 的虚拟线程被安排在数量较少 (N) 的操作系统线程上运行。

-1
投票

© www.soinside.com 2019 - 2024. All rights reserved.