目录
二、Quasar From parallel universe
一、Java的线程模型
Java语言对于线程进行了完整抽象,你无需关注各类操作系统的差异,写出并发程序不需要特别陡峭的学习曲线,想想就特别美好。
但现实是这一统一的线程模型在云原生时代反而失去了优势,因为与操作系统1:1对应的线程模型,导致Java的线程是一种非常重量级的线程(内存占用和上下文切换)。
💡 64 位 Linux 上 HotSpot 的线程栈容量默认是1MB,线程的内核元数据(Kernel Metadata)还要额外消耗 2-16KB 内存,所以单个虚拟机的最大线程数量一般只会设置到 200 至 400 条,当程序员把数以百万计的请求往线程池里面灌时,系统即便能处理得过来,其中的切换损耗也相当可观的。
这种模型对于CPU密集型的应用会有更好的资源利用率,但对于IO密集型的就会十分痛苦。为提高Java中IO的性能,我们大量使用Reactor编程模型、Netty的非阻塞多路复用IO几乎成为了规范,但这类IO场景在底层实现上有两大挑战:
1.大量线程,IO操作越多,为提高吞吐量往往增加更多线程。
2.异步编程,为避免线程阻塞,必须采用异步编程,但很明显,异步可读性差、嵌套过深、反人类。
如何解决这个问题呢?
核心是要重新设计线程模型和结构化并发。
Green Thread是上古Java采用过的模型,OS Thread是当前Java使用过的,Virtual Thread是正在努力进行的。
结构化并发是 2016 年才提出的新的并发编程概念。可以让你像写同步代码的方式写异步代码。
从两个项目开始深入介绍一下Java在线程模型上的努力和发展趋势。
二、Quasar From parallel universe
Quasar 是一个为 Java 和Kotlin提供高性能轻量级线程、类似 Go 的channels、类似 Erlang 的 actors 以及其他异步编程工具的库。
Quasar 由Parallel Universe开发并作为自由软件发布,根据 Eclipse 公共许可证和GNU Lesser General Public License 获得双重许可。
不过这个框架在2018年已停止维护。目前已迁移到即将介绍的Project Loom中。
虽然已经废弃,但在2018年属于Java非常前沿的技术,当时也做了具体的调研和开发验证,最大的作用是轻量级线程Fiber的运用和像写同步代码的方式写异步代码的编程模式(不过实现这种效果还是比较复杂)。
以下是当时改造Tomcat以支持servlet逻辑中fiber线程的运用:
maven配置
<dependency>
<groupId>co.paralleluniverse</groupId>
<artifactId>quasar-core</artifactId>
<version>0.7.10</version>
</dependency>
扩展Tomcat的业务执行线程池:
/**
* 测试 使用Servlet的方式,而非替换内部线程执行
* 2018/8/28.
*/
public class FiberTomcatThreaPool extends StandardThrea