Green Threads 已在 Java 1.1 中实现,并在后续 Java 版本中被删除。 Java 19 引入了 虚拟线程
作为预览功能。https://openjdk.org/jeps/425 两个线程似乎都在用户空间中工作,而不是像 Java 本机线程那样在内核空间中工作。
它们之间有什么区别?新的虚拟线程是否消除了之前绿色线程的限制?
JEP 425
只是一个小概述
虚拟线程的重要部分不在于它们是多核的(对于服务器来说,核心数量显然不是IO瓶颈),而是所有阻塞操作都被转换为非阻塞操作,这些操作使用下面的epoll之类的东西引擎盖,后台有一个协调器线程运行一个事件循环,当虚拟线程等待的文件描述符准备就绪时,该事件循环会唤醒虚拟线程。
all
绿色线程等待。换句话说,旧的绿色线程并没有让 IO 变得容易,仍然迫使你手动异步编程,而虚拟线程的设计目的是让异步 IO 变得简单,就像 Go 的 goroutine 一样。由于绿色线程不能用于同时等待许多事情,因此它们的性能优于平台线程,操作系统调度程序可以通过 IO 唤醒它们(以昂贵的上下文切换为代价)。不是因为是单线程,而是因为他们甚至无法同时等待很多事情。
Java 的绿色线程都共享一个操作系统线程(M:1 调度),最终被作为操作系统线程包装器实现的平台线程(Java 的本机线程)超越(1:1 调度) 虚拟线程采用 M:N 调度,其中大量线程数量 (M) 的虚拟线程被安排在数量较少 (N) 的操作系统线程上运行。