绿色线程

在计算机程序设计中，绿色线程是一种由运行环境或虚拟机调度，而不是由本地底层操作系统调度的线程。绿色线程并不依赖于底层的操作系统提供的支持，而是通过模拟来实现运行多线程，这种线程的调度发生在用户空间而不是内核空间，所以它们可以在没有原生线程支持的环境中工作。

 词源 
绿色线程的名称来源于最初的Java线程库。这是因为甲骨文公司的「绿色团队」最初设计了Java 的线程库。

 性能 
在多核处理器上，原生线程可以自动将工作分配给多个处理器，而绿色线程做不到这一点。在某些虚拟机中，绿色线程可以启动得更快。然而，在单处理器计算机上，最有效的工作方式依旧没有定论。在一台运行着（运行时间很长的）Linux 2.2 内核的电脑上的测试表明：
 绿色线程的性能在线程激活和同步上明显好于原生线程。
 Linux原生线程的性能在 I/O 操作和上下文切换 (Context Switch) 上略好于绿色线程。
当一个绿色线程执行一个阻塞的系统调用，不仅是当前的线程被阻塞，而是当前进程中的所有线程都会被阻塞。如果虚拟机在实现绿色线程时，为每个 I/O 操作分配特定的 I/O进程（这些进程对用户透明）可以减少用户编程时的负责度，但是为了避免阻塞问题，绿色线程必须使用异步I/O操作。

对应的，在使用原生线程时，也有方法可以减少线程激活和同步的开销：
 使用线程池可以通过重用有限数量的线程，来降低重新生成新线程的成本。
 使用虚拟机和原生线程的语言可以使用Escape analysis，来避免在不需要的情况下同步代码块。

 Java虚拟机中的绿色线程 
 舊版本 
在Java 1.1中，绿色线程（至少在 Solaris 上）是JVM 中使用的唯一一种线程模型。由于绿色线程和原生线程比起来在使用时有一些限制，随后的 Java 版本中放弃了绿色线程，转而使用原生线程。是一个例外，它是低功耗设备的操作系统和Java虚拟机的混合体。它使用绿色线程来保持机器语言的绝对最小并支持分离的迁移。Kilim和Quasar 是在随后的 JVM 版本中通过修改Java 编译器产生的字节码来实现绿色线程的开源项目（Quasar 也支持 Kotlin 和 Clojure）。

 Java新版的虛擬執行緒 
從 Java 21 版開始，以代號 JEP 444 重新加入綠色-{}-執行緒的功能，並改名為「虛擬-{}-執行緒」。

 其他语言的绿色线程 
还有一些其他的编程语言也实现了可以替代原生线程的绿色线程。例如：
 CHICKEN Scheme uses lightweight user-level threads based on first-class continuations
 Common Lisp
 CPython with greenlet, eventlet  and gevent , PyPy
 D offers fibers, used for asynchronous I/O as the basis for tasks in the web framework Vibe.d
 Erlang 
 Go
 Haskell
 Julia uses green threads for its Tasks .
 Limbo 
 Lua uses coroutines  for concurrency. Lua 5.2 also offers true C coroutine semantics through the functions lua_yieldk , lua_callk , and lua_pcallk . The CoCo  extension allows true C coroutine semantics for Lua 5.1.
 Occam, which prefers the term "process" instead of "thread" due to its origins in communicating sequential processes
 Ruby before version 1.9
 Racket (native threads are also available through Places)
  Rust support for green-threads is possible using mioco library
 SML/NJ's implementation of Concurrent ML
 Smalltalk (most dialects: Squeak, VisualWorks, GNU Smalltalk, etc.)
 Stackless Python supports either preemptive multitasking or cooperative multitasking through microthreads (so-called tasklets).
 Tcl has coroutines  and an event loop
 PHP supports green threads through coroutines 

 另请参阅 
 轻量级进程
 协程
 Java虚拟机
 全局解释器锁
 纤程
 GNU可移植线程库
 Protothreads

 参考资料 

Category:Java平台