我们知道Go语言最大的亮点之一就是原生支持并发,这要归功于Go语言的协程机制。一个go语句可以启动一个协程(goroutin)。协程本质上是一个用户态线程,不需要操作系统来调度,而是由用户程序自己管理和调度。它存储在线程中,系统开销很小,性能和并发性可以得到显着提升。使用协程的优点是运行效率高,编程简单,结构清晰。目前,原生支持协程的语言并不多。甲骨文本周提交的JDK增强提案(JEP)草案要求将虚拟线程作为Java标准版的一部分进行预览。虚拟线程类似于Go语言中的协程,将补充Java的平台线程(代表操作系统线程),用轻量级的用户态线程实现,将更有效地利用可用硬件,并大大降低成本。虚拟线程的目的是更好地支持编写和维护高吞吐量并发应用程序。该提案指出,线程对于表示并发单元(如事务)很有用。Java目前Thread的实现,每个Java线程消耗一个操作系统线程,操作系统线程稀缺且昂贵。现代服务器的功能可以处理比操作系统线程多几个数量级的并发事务。编写高吞吐量服务器软件的开发人员必须在事务之间共享线程以有效利用硬件。这是通过线程池完成的,线程池将线程从一个事务借出到另一个事务,以节省为每个事务创建线程的成本。当这还不够时,开发人员开始将线程返回到线程池,甚至在事务处理过程中等待I/O。然而,这会导致异步编程风格需要一组独立的、不兼容的API,并使故障排除、调试、观察和分析变得非常困难。虚拟线程是java.lang.Thread的用户模式实现,它不会阻塞操作系统线程并实现接近最佳的硬件利用率。虚拟线程允许高级别的并发性和高吞吐量,同时程序与Java平台和工具的基于线程的设计保持兼容。虚拟线程之于平台线程就像虚拟内存之于物理RAM:一种通过自动映射到底层物理资源来提供丰富“虚拟”资源的机制。该提案指出,使用虚拟线程不需要学习新的编程模型。用Java编写并发应用程序的开发人员已经知道这种模型。然而,由于线程的高成本,开发人员需要改变旧习惯,尤其是线程池的使用,线程池只有在它们池化的资源稀缺或创建成本高时才有用。虚拟线程是JDK实现的java.lang.Thread实例,它允许多个活动实例共存于同一个进程中。虚拟线程与平台线程具有相同的语义,只是它们属于单个线程组并且不能被枚举。参考资料:进程、线程、协程的区别编程宝典
