咱们晓得 Go 语言最大亮点之一就是原生反对并发,这得益于 Go 语言的协程机制。一个 go 语句就能够发动一个协程 (goroutin)。
协程实质上是一种用户态线程,它不须要操作系统来进行调度,而是由用户程序自行治理和调度。它存放于线程中,零碎开销极小,能够显著的进步性能和并发能力。应用协程的长处是运行效率高、编程简略、构造清晰。目前,原生反对协程的语言不是很多。
Oracle 本周提交的一份 JDK 加强倡议(JEP)草案要求将虚构线程作为 Java 标准版的一部分进行预览。
虚构线程相似于 Go 语言的协程,将补充 Java 的平台线程(代表操作系统线程),采纳轻量级的用户模式线程实现,将更无效地利用可用的硬件,并大大降低老本。
虚构线程目标是更好地反对编写和保护高吞吐量并发应用程序。
该提案指出,线程对于代表一个并发单元(如事务)是很有用的。Java 目前对 Thread 的实现是为每个 Java 线程耗费一个操作系统线程,而操作系统线程是稀缺和低廉的。古代服务器的能力能够解决比操作系统线程更多数量级的并发事务。
编写高吞吐量服务器软件的开发者不得不在事务之间共享线程,以无效利用硬件。这是用线程池来实现的,它将线程借给一个又一个事务,以节俭为每个事务创立线程的老本。当这还不够时,开发人员开始将线程返回到线程池中,甚至在事务的两头,在期待 I / O 的时候。然而,这导致了一种异步的编程格调,须要一套独立的、不兼容的 API,并使故障排除、调试、察看和剖析变得十分艰难。
虚构线程是 java.lang.Thread 的用户模式实现,它不会阻塞操作系统线程,可能实现靠近最佳的硬件利用率。虚构线程容许高水平的并发,以及高吞吐量,同时程序依然与 Java 平台和工具的基于线程的设计相协调。虚构线程对于平台线程来说,就像虚拟内存对于物理 RAM 一样:一种通过主动映射到底层物理资源而提供丰盛的 “ 虚构 “ 资源的机制。
该提案指出,应用虚构线程不须要学习新的编程模型。应用 Java 编写并发应用程序的开发者曾经晓得这个模型。然而,开发人员须要扭转因为线程的高老本而产生的旧习惯,特地是应用线程池,这些线程池只有在它们所会集的资源稀缺或创立老本昂扬时才有用。
虚构线程是由 JDK 实现的 java.lang.Thread 的实例,它容许许多流动实例在同一过程中共存。虚构线程的语义与平台线程雷同,只是它们属于繁多的 ThreadGroup,不能被枚举。
参考资料:
- 过程、线程和协程的区别
- 编程宝库