Project Loom 正在积极开发中,最近已针对 JDK 19 作为预览功能,其目标是更容易编写、调试和维护并发 Java 应用程序。详细了解 Project Loom 的并发模型和虚拟线程。

Java中的线程是什么?什么是虚拟线程?

在Java和一般计算中,线程是一个独立的执行流。它告诉你的程序做一些事情。有了线程,你可以让多件事情同时发生。

Java中的传统线程非常繁重,并且与操作系统线程一对一绑定,这使得调度线程成为操作系统的工作。这意味着线程的执行时间取决于CPU。虚拟线程,也称为绿色线程或用户线程,将调度的责任从操作系统转移到应用程序,在本例中是JVM。这允许JVM在决定下一步调度哪个线程时,利用它对虚拟线程中发生的事情的了解。

虚拟线程的优势

今天,Java大量用于后端web应用程序,为来自用户和其他应用程序的并发请求提供服务。在传统的阻塞I/O中,线程在等待数据被读取或写入时会阻塞继续执行。由于线程的繁重,应用程序可以拥有的线程数量是有限的,因此应用程序可以处理的并发连接数量也是有限的。这个约束意味着线程不能很好地伸缩。

长期以来,解决这个问题的方法是使用非阻塞的异步I/O。当使用异步I/O时,单线程可以处理许多并发连接,但代价是增加了代码的复杂性。处理单个连接的单个执行流更容易理解和推理。虽然今天的许多框架,特别是反应式框架,对开发人员隐藏了许多这种复杂性,但是异步I/O需要不同的思维方式。

为什么要使用Project Loom?

这就是织机项目的用武之地。虚拟线程让开发人员有机会使用传统的阻塞I/O进行开发,因为虚拟线程的一大好处是阻塞一个虚拟线程不会阻塞整个操作系统线程。这消除了阻塞I/O的可伸缩性问题,但没有使用异步I/O所增加的代码复杂性,因为我们回到了只监督单个连接的单个线程。

使用 Project Loom 扩展 Java 线程

使用虚拟线程进行开发与使用传统线程进行开发几乎相同,增强提案为此添加了几个 API 方法。在java培训中,也有关于线程的学习,理论知识+实践项目,双管齐下,学以致用,让你深入浅出地学习java。

Thread类本身有一些添加的方法,例如Thread.ofVirtual(),它们返回一个构建器来启动虚拟线程或创建一个ThreadFactory。同样,已添加Executors.newVirtualThreadPerTaskExecutor() 以创建使用虚拟线程的ExecutorService。在许多情况下,切换到使用这些来创建ExecutorService 或ThreadFactory就足以利用虚拟线程!

与任何其他预览功能一样,要利用它,你需要在编译和运行时添加 --enable-preview JVM 参数。

Project Loom和Java 的未来

尽管异步 I/O 很难,但很多人已经成功地做到了,但这种思维方式的转变并未被广泛采用。Netflix 以使用响应式编程而广为人知,并且是响应式编程框架的重要贡献者,但即使他们最近也缩减了使用量。

虽然虚拟线程不会神奇地让一切运行得更快,但针对当前早期访问版本运行的基准测试表明,你可以获得与使用异步I/O时相似的可伸缩性、吞吐量和性能。

在虚拟线程的当前实现中,虚拟线程调度器是一个工作窃取 fork-join 池。对于大多数人来说,这可能就是所需要的。但是已经提出了能够提供你自己的调度程序来代替使用的请求。虽然当前预览版目前不支持此功能,但我们可能会在未来的改进或增强提案中看到它。

虚拟线程目前的目标是作为预览功能包含在JDK 19中。如果一切顺利,虚拟线程应该准备好在JDK 21发布时退出预览状态,这可能是下一个LTS版本。

对于早期采用者,已经包含在JDK 19的最新早期版本中。因此,如果你愿意,就去尝试一下,并将你的体验反馈给OpenJDK开发人员,这样他们就可以适应和改进未来版本的实现。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部