当前位置:首页 > 科技  > 软件

超越传统线程:探索Java Loom协程(纤程/虚拟线程)的无限潜力

来源: 责编: 时间:2023-10-13 14:38:02 396观看
导读一、Java协程的发展历程Java协程的发展历程可以概括为以下几个阶段:1963年,协程的概念被正式提出,它的诞生甚至早于线程。2007年,Kilim项目发布,它是一个基于字节码增强技术的Java协程框架。2014年,Quasar项目发布,它是一个

7pK28资讯网——每日最新资讯28at.com

一、Java协程的发展历程

Java协程的发展历程可以概括为以下几个阶段:7pK28资讯网——每日最新资讯28at.com

  • 1963年,协程的概念被正式提出,它的诞生甚至早于线程。
  • 2007年,Kilim项目发布,它是一个基于字节码增强技术的Java协程框架。
  • 2014年,Quasar项目发布,它是一个基于Agent技术的Java协程框架。
  • 2016年,Project Loom项目启动,它是一个旨在为Java提供原生协程支持的项目。
  • 2019年,Kotlin语言发布1.3版本,它是一个支持协程编程的Java兼容语言。
  • 2020年,Java 15发布,它包含了Project Loom的预览版(Preview Feature),提供了虚拟线程(Virtual Thread)和Scope Variable等特性。

早期尝试: 在 Java 早期版本中,并发主要通过线程和同步机制来实现。尽管 Java 提供了多线程支持,但由于线程的创建和切换开销较大,这使得高并发的场景处理效率较低。7pK28资讯网——每日最新资讯28at.com

Quasar(2011年): Quasar 是由 Parallel Universe 开发的一个基于字节码操纵和 bytecode instrumentation 的 Java 协程库。它在 Java 中实现了类似协程的概念,通过操纵字节码来实现轻量级的协程和任务切换。Quasar 提供了协程式的编程方式,允许在一个线程中执行多个协程,从而避免了线程切换的开销。7pK28资讯网——每日最新资讯28at.com

Kotlin Coroutines(2017年): Kotlin 是一种运行在 JVM 上的编程语言,由 JetBrains 开发。Kotlin Coroutines 是 Kotlin 的异步编程框架,允许以协程的方式编写异步代码。虽然 Kotlin 是一种独立的编程语言,但它可以与 Java 无缝集成,因此你可以在 Java 项目中使用 Kotlin Coroutines。7pK28资讯网——每日最新资讯28at.com

Project Loom(进行中): Project Loom 是 OpenJDK 的一个子项目,致力于为 Java 引入轻量级线程(称为 Virtual Threads 或者 Loom Threads)。Loom 的目标是在不改变现有 Java 程序的前提下,为 Java 增加纤程的能力。Loom 的设计目标是实现一个高效且易用的协程和轻量级线程模型,以解决 Java 并发编程的挑战。7pK28资讯网——每日最新资讯28at.com

Java 标准库中仍然没有原生支持协程的特性。然而,上述项目和库的出现表明 Java 社区对于高效并发编程的需求,以及对于协程式编程的探索和实践,并且未来 Java 的发展可能会进一步引入更加高级的并发机制,为开发者提供更优雅和高效的并发编程体验。7pK28资讯网——每日最新资讯28at.com

二、Java Project Loom

Java Project Loom是Java语言的一个重要项目,它旨在改进Java虚拟机(JVM)的执行模型,以支持轻量级线程(Lightweight Threads),从而提高Java在处理并发和并行编程方面的性能和可伸缩性。本文将介绍Java Project Loom的背景、目标、主要特性以及对Java开发者和应用程序的影响。7pK28资讯网——每日最新资讯28at.com

1、背景

在Java开发中,线程(Thread)是一种常用的并发机制,允许程序以多个独立的执行路径同时运行。然而,传统的Java线程模型存在一些问题。每个线程都映射到操作系统的本地线程,这会导致创建和销毁线程的开销较大。而且,由于每个线程都会占用一定的内存空间,当并发程度较高时,大量线程的创建可能会导致内存消耗过大,甚至导致系统崩溃。7pK28资讯网——每日最新资讯28at.com

为了解决这些问题,Java Project Loom项目应运而生。7pK28资讯网——每日最新资讯28at.com

Java Project Loom的主要目标是引入一种轻量级线程实现,称为“Fibers”(纤程),以优化Java线程的管理和执行模型。Fibers是一种用户态线程,由Java虚拟机(JVM)和运行时系统进行管理,不再需要映射到操作系统的本地线程。这样,Fibers的创建和销毁开销将大大降低,并且可以在同一个操作系统线程内运行大量Fibers,从而减少内存消耗和提高性能。7pK28资讯网——每日最新资讯28at.com

2、主要特性

Java Project Loom带来了许多重要特性,其中最显著的是:7pK28资讯网——每日最新资讯28at.com

(1)Fibers(纤程)

Fibers是Java Project Loom的核心特性。它们是一种轻量级的、用户态的线程实现,可以通过Fiber API进行创建、挂起、恢复和取消。与传统线程相比,Fibers的创建和销毁成本较低,并且可以高效地复用线程资源,使得应用程序可以拥有数千甚至数百万个并发执行的Fibers,而不会产生显著的内存开销。7pK28资讯网——每日最新资讯28at.com

(2)Continuations(续体)

为了支持Fibers,Java Project Loom引入了Continuations的概念。Continuations允许在Fiber被挂起时保存其执行状态,并在需要时恢复到挂起的状态。这为Fibers的挂起和恢复提供了一种高效的机制,避免了传统线程上下文切换的开销。7pK28资讯网——每日最新资讯28at.com

(3)Virtual Threads(虚拟线程)

Java Project Loom还引入了Virtual Threads的概念,它是一种对Fibers进行透明封装的机制。Virtual Threads可以根据应用程序的需求来动态地创建和管理Fibers,让开发者可以使用简单的编程模型处理大规模并发而无需担心线程管理细节。7pK28资讯网——每日最新资讯28at.com

(4)Scoped Threads(作用域线程)

Scoped Threads是Java Project Loom的另一个重要特性,它允许Fibers在有限的作用域内运行。这样,Fiber在超出其作用域后将自动被销毁,从而避免了资源泄漏和线程管理的复杂性。7pK28资讯网——每日最新资讯28at.com

3、Project Loom的影响

Java Project Loom的推出将对Java开发者和应用程序产生深远的影响:7pK28资讯网——每日最新资讯28at.com

(1)更高的并发性能

通过引入轻量级的Fibers,Java Project Loom将使得Java应用程序可以更高效地处理大量并发任务,从而提供更高的并发性能和更好的可伸缩性。7pK28资讯网——每日最新资讯28at.com

(2)更低的内存消耗

由于Fibers不再需要映射到操作系统的本地线程,Java应用程序的内存消耗将显著降低,特别是在高并发场景下,这将对资源有限的环境和云计算平台尤为重要。7pK28资讯网——每日最新资讯28at.com

(3)更简洁的代码

Virtual Threads和Scoped Threads的引入将简化并发编程的代码逻辑,使得开发者可以更专注于业务逻辑而无需过多关注底层线程管理。7pK28资讯网——每日最新资讯28at.com

(4)更好的响应性

Java Project Loom的改进将使得Java应用程序更具响应性,特别是在高负载和高并发情况下,应用程序仍然能够快速响应用户请求。7pK28资讯网——每日最新资讯28at.com

总体而言,Java Project Loom是Java语言迈向更高并发性和更好性能的重要一步。通过引入Fibers和相关的特性,它将为Java开发者带来更强大的工具,使得开发高效、高并发的Java应用程序变得更加容易。随着Java生态系统的不断发展,Java Project Loom必将成为Java开发中不可或缺的重要组成部分。7pK28资讯网——每日最新资讯28at.com

4、Samples

许多应用程序不会直接使用 Thread API,而是使用
java.util.concurrent.ExecutorService和 Executors API。Executors API 已更新为 ExecutorServices 的新工厂方法,为每个任务启动一个新线程。虚拟线程足够便宜,可以为每个任务创建一个新的虚拟线程,永远不需要池化虚拟线程。
7pK28资讯网——每日最新资讯28at.com

下面启动一个虚拟线程来打印消息。它调用join方法来等待线程终止。7pK28资讯网——每日最新资讯28at.com

Thread thread = Thread.ofVirtual().start(() -> System.out.println("Hello"));thread.join();

下面是一个在休眠后启动虚拟线程将元素放入队列的示例。主线程阻塞在队列上,等待元素。7pK28资讯网——每日最新资讯28at.com

var queue = new SynchronousQueue<String>();Thread.ofVirtual().start(() -> {    try {        Thread.sleep(Duration.ofSeconds(2));        queue.put("done");    } catch (InterruptedException e) { }}); String msg = queue.take();

Thread.Builder API 也可用于创建 ThreadFactory。以下代码片段创建的 ThreadFactory 将创建名为“worker-0”、“worker-1”、“worker-2”等的虚拟线程。7pK28资讯网——每日最新资讯28at.com

ThreadFactory factory = Thread.ofVirtual().name("worker", 0).factory();

以下示例使用 Executors API 创建一个 ExecutorService,为每个任务启动一个新的虚拟线程。 该示例使用 try-with-resources 构造来确保 ExecutorService 在继续之前已终止。7pK28资讯网——每日最新资讯28at.com

ExecutorService定义了提交方法来执行任务。提交方法不会阻塞,而是返回一个可用于等待结果或异常的 Future 对象。接受任务集合的 Submit 方法会返回一个 Stream,该 Stream 会延迟填充代表结果的已完成的 Future 对象。7pK28资讯网——每日最新资讯28at.com

该示例还使用 invokeAll 和invokeAny 组合器方法 来执行多个任务并等待它们完成。7pK28资讯网——每日最新资讯28at.com

try (ExecutorService executor = Executors.newVirtualThreadExecutor()) {      // Submits a value-returning task and waits for the result    Future<String> future = executor.submit(() -> "foo");    String result = future.join();     // Submits two value-returning tasks to get a Stream that is lazily populated    // with completed Future objects as the tasks complete    Stream<Future<String>> stream = executor.submit(List.of(() -> "foo", () -> "bar"));    stream.filter(Future::isCompletedNormally)            .map(Future::join)            .forEach(System.out::println);     // Executes two value-returning tasks, waiting for both to complete    List<Future<String>> results1 = executor.invokeAll(List.of(() -> "foo", () -> "bar"));     // Executes two value-returning tasks, waiting for both to complete. If one of the    // tasks completes with an exception, the other is cancelled.    List<Future<String>> results2 = executor.invokeAll(List.of(() -> "foo", () -> "bar"), /*waitAll*/ false);     // Executes two value-returning tasks, returning the result of the first to    // complete, cancelling the other.    String first = executor.invokeAny(List.of(() -> "foo", () -> "bar"));}


7pK28资讯网——每日最新资讯28at.com

三、SpringBoot如何使用协程

1、Project Loom

Java Project Loom旨在改进Java虚拟机的执行模型,其中核心概念是Fibers,也称为轻量级线程。Fibers提供了一种轻量级的线程模型,可以高效地创建和管理大量的并发任务,而不像传统线程那样消耗大量的系统资源。虽然Spring Boot本身没有集成Project Loom,但可以在Spring Boot应用程序中使用Project Loom来实现协程。为此,你需要使用Java 17或更新版本,并引入Project Loom的依赖。7pK28资讯网——每日最新资讯28at.com

以下是一个简单的示例,展示如何使用Project Loom的Fibers来实现协程:7pK28资讯网——每日最新资讯28at.com

public class CoroutineExample {    public static void main(String[] args) throws InterruptedException {        ExecutorService executorService = Executors.newVirtualThreadExecutor();        SubmissionPublisher<String> publisher = new SubmissionPublisher<>(executorService, 1);        // Subscribe to the publisher        publisher.subscribe(new SimpleSubscriber());        // Publish some data        for (int i = 0; i < 5; i++) {            publisher.submit("Data " + i);        }        // Close the publisher and wait for the subscribers to finish        publisher.close();        executorService.awaitTermination(1, TimeUnit.SECONDS);        executorService.shutdown();    }}

2、Quasar框架

Quasar是一个基于Java的协程库,它提供了协程的实现和管理。使用Quasar,你可以在Spring Boot应用程序中创建协程来处理并发任务。7pK28资讯网——每日最新资讯28at.com

要使用Quasar,你需要将其作为依赖项添加到Spring Boot项目中。然后,你可以使用Quasar提供的API来创建、挂起和恢复协程。7pK28资讯网——每日最新资讯28at.com

以下是一个简单的示例,展示如何在Spring Boot应用程序中使用Quasar实现协程:7pK28资讯网——每日最新资讯28at.com

@FiberSpringBootApplication    public class CoroutineExample {        public static void main(String[] args) throws InterruptedException {            new Fiber<Void>(() -> {                for (int i = 0; i < 5; i++) {                    System.out.println("Data " + i);                    try {                        Fiber.sleep(1000);                    } catch (SuspendExecution | InterruptedException e) {                        e.printStackTrace();                    }                }            }).start().join();        }    }


7pK28资讯网——每日最新资讯28at.com

四、第三方集成

1、Vert.x

Vert.x是一个基于事件驱动的响应式框架,它可以让开发者使用Java或其他JVM语言编写高性能的异步应用。Vert.x已经开始尝试集成Java虚拟线程,目前有一个虚拟线程孵化器项目,它包含了一个async/await的实现。这个项目可以让开发者使用类似于JavaScript或C#的语法来编写异步代码,而不需要使用回调或者Future7pK28资讯网——每日最新资讯28at.com

7pK28资讯网——每日最新资讯28at.com

Vert.x是一个用于构建响应式、高性能、可伸缩的应用程序的工具包和框架。它基于Java语言,提供了一个异步编程模型,使得开发者可以轻松地构建事件驱动的、非阻塞的应用程序。7pK28资讯网——每日最新资讯28at.com

主要特点和优势:7pK28资讯网——每日最新资讯28at.com

  • 响应式和非阻塞:Vert.x采用了事件循环和异步编程模型,允许应用程序以非阻塞方式处理请求和事件,从而实现高吞吐量和低延迟。
  • 多语言支持:尽管Vert.x是用Java构建的,但它还支持其他语言,如Kotlin、Groovy和JavaScript。这使得开发者可以使用自己喜欢的语言来编写应用程序。
  • 内置集群支持:Vert.x内置了集群支持,可以在多个节点上运行应用程序实例,从而实现水平扩展和高可用性。
  • 组件丰富:Vert.x提供了丰富的组件和库,包括HTTP服务器、WebSocket、消息总线、数据库客户端等,使得开发者能够快速构建各种类型的应用程序。
  • 轻量级:Vert.x是一个轻量级框架,不像一些大型框架那样臃肿,可以在资源有限的环境中运行。
  • 社区活跃:Vert.x拥有一个活跃的开源社区,持续开发和更新,使得它保持在技术前沿,并且有很多贡献者为其提供支持和扩展。

Vert.x适用于构建各种类型的应用程序,特别是需要高性能、高并发和实时性的场景。它可以用于构建Web应用程序、API服务、实时通信应用、IoT应用等。如果您对响应式编程和高性能的应用程序开发感兴趣,Vert.x值得一试。7pK28资讯网——每日最新资讯28at.com

7pK28资讯网——每日最新资讯28at.com

2、Jetty

Jetty是一个轻量级的Java web服务器和servlet容器。Jetty也已经支持了Java虚拟线程7pK28资讯网——每日最新资讯28at.com

Java 19 中引入的虚拟线程在 Jetty 12 中受支持,因为它们分别从 10.11.10 和 0.12.11 开始在 Jetty 0 和 Jetty 12 中得到支持。7pK28资讯网——每日最新资讯28at.com

当 JVM 支持虚拟线程并在 Jetty 中启用时(请参阅嵌入式用法和独立用法),将使用虚拟线程调用应用程序,这允许它们使用简单的阻塞 API,但具有虚拟线程的可伸缩性优势。7pK28资讯网——每日最新资讯28at.com

3、Tomcat

7pK28资讯网——每日最新资讯28at.com

Tomcat是一个广泛使用的Java web服务器和servlet容器。Tomcat也支持Java虚拟线程,并在版本中有相关说明。7pK28资讯网——每日最新资讯28at.com

4、Helidon

Helidon是一个微服务框架,它提供了两种编程模型:Helidon SE和Helidon MP。Helidon SE是一个基于函数式编程的轻量级框架,它支持Reactive Streams和非阻塞IO。Helidon MP是一个基于标准化的注解驱动的框架,它支持MicroProfile API。Helidon也已经集成了Java虚拟线程,并提供了一些示例代码来展示如何使用它。7pK28资讯网——每日最新资讯28at.com

5、Quarkus

7pK28资讯网——每日最新资讯28at.com

Quarkus是一个为云原生应用而生的全栈框架,它提供了高性能、低内存占用、快速启动和热重载等特性。Quarkus也已经支持了Java虚拟线程,并提供了一些文档和指南来介绍如何使用它。7pK28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-13589-0.html超越传统线程:探索Java Loom协程(纤程/虚拟线程)的无限潜力

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Java遍历一个 List 有哪些方式?每种的实现原理以及哪种最高效?

下一篇: 让CSS官方后悔的一些决定

标签:
  • 热门焦点
  • 天猫精灵Sound Pro体验:智能音箱没有音质?来听听我的

    这几年除了手机作为智能生活终端最主要的核心之外,第二个可以成为中心点的产品是什么?——是智能音箱。 手机在执行命令的时候有两种操作方式,手和智能语音助手,而智能音箱只
  • 2023 年的 Node.js 生态系统

    随着技术的不断演进和创新,Node.js 在 2023 年达到了一个新的高度。Node.js 拥有一个庞大的生态系统,可以帮助开发人员更快地实现复杂的应用。本文就来看看 Node.js 最新的生
  • 如何通过Python线程池实现异步编程?

    线程池的概念和基本原理线程池是一种并发处理机制,它可以在程序启动时创建一组线程,并将它们置于等待任务的状态。当任务到达时,线程池中的某个线程会被唤醒并执行任务,执行完任
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 讲故事上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋友反
  • 电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    记者丨宁晓敏 见习生丨汗青出品丨鳌头财经(theSankei) 前不久,爱奇艺发布了一份亮眼的一季报,不仅营收和会员营收创造历史最佳表现,其运营利润也连续6个月实现增长。自去年年初
  • 本地生活这块肥肉,拼多多也想吃一口

    出品/壹览商业 作者/李彦编辑/木鱼拼多多也看上本地生活这块蛋糕了。近期,拼多多在App首页&ldquo;充值中心&rdquo;入口上线了本机生活界面。壹览商业发现,该界面目前主要
  • 2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
  • 最薄的14英寸游戏笔记本电脑 Alienware X14已可以购买

    2022年1月份在国际消费电子展(CES2022)上首次亮相的Alienware新品——Alienware X14现在已经可以购买了,这款笔记本电脑被誉为世界上最薄的 14 英寸游戏笔
  • 世界人工智能大会国际日开幕式活动在世博展览馆开启

    30日上午,世界人工智能大会国际日开幕式活动在世博展览馆开启,聚集国际城市代表、重量级院士专家、国际创新企业代表,共同打造人工智能交流平台。上海市副市
Top