AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

超越傳統線程:探索Java Loom協程(纖程/虛擬線程)的無限潛力

來源: 責編: 時間:2023-10-13 14:38:02 231觀看
導讀一、Java協程的發展歷程Java協程的發展歷程可以概括為以下幾個階段:1963年,協程的概念被正式提出,它的誕生甚至早于線程。2007年,Kilim項目發布,它是一個基于字節碼增強技術的Java協程框架。2014年,Quasar項目發布,它是一個

31j28資訊網——每日最新資訊28at.com

一、Java協程的發展歷程

Java協程的發展歷程可以概括為以下幾個階段:31j28資訊網——每日最新資訊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 提供了多線程支持,但由于線程的創建和切換開銷較大,這使得高并發的場景處理效率較低。31j28資訊網——每日最新資訊28at.com

Quasar(2011年): Quasar 是由 Parallel Universe 開發的一個基于字節碼操縱和 bytecode instrumentation 的 Java 協程庫。它在 Java 中實現了類似協程的概念,通過操縱字節碼來實現輕量級的協程和任務切換。Quasar 提供了協程式的編程方式,允許在一個線程中執行多個協程,從而避免了線程切換的開銷。31j28資訊網——每日最新資訊28at.com

Kotlin Coroutines(2017年): Kotlin 是一種運行在 JVM 上的編程語言,由 JetBrains 開發。Kotlin Coroutines 是 Kotlin 的異步編程框架,允許以協程的方式編寫異步代碼。雖然 Kotlin 是一種獨立的編程語言,但它可以與 Java 無縫集成,因此你可以在 Java 項目中使用 Kotlin Coroutines。31j28資訊網——每日最新資訊28at.com

Project Loom(進行中): Project Loom 是 OpenJDK 的一個子項目,致力于為 Java 引入輕量級線程(稱為 Virtual Threads 或者 Loom Threads)。Loom 的目標是在不改變現有 Java 程序的前提下,為 Java 增加纖程的能力。Loom 的設計目標是實現一個高效且易用的協程和輕量級線程模型,以解決 Java 并發編程的挑戰。31j28資訊網——每日最新資訊28at.com

Java 標準庫中仍然沒有原生支持協程的特性。然而,上述項目和庫的出現表明 Java 社區對于高效并發編程的需求,以及對于協程式編程的探索和實踐,并且未來 Java 的發展可能會進一步引入更加高級的并發機制,為開發者提供更優雅和高效的并發編程體驗。31j28資訊網——每日最新資訊28at.com

二、Java Project Loom

Java Project Loom是Java語言的一個重要項目,它旨在改進Java虛擬機(JVM)的執行模型,以支持輕量級線程(Lightweight Threads),從而提高Java在處理并發和并行編程方面的性能和可伸縮性。本文將介紹Java Project Loom的背景、目標、主要特性以及對Java開發者和應用程序的影響。31j28資訊網——每日最新資訊28at.com

1、背景

在Java開發中,線程(Thread)是一種常用的并發機制,允許程序以多個獨立的執行路徑同時運行。然而,傳統的Java線程模型存在一些問題。每個線程都映射到操作系統的本地線程,這會導致創建和銷毀線程的開銷較大。而且,由于每個線程都會占用一定的內存空間,當并發程度較高時,大量線程的創建可能會導致內存消耗過大,甚至導致系統崩潰。31j28資訊網——每日最新資訊28at.com

為了解決這些問題,Java Project Loom項目應運而生。31j28資訊網——每日最新資訊28at.com

Java Project Loom的主要目標是引入一種輕量級線程實現,稱為“Fibers”(纖程),以優化Java線程的管理和執行模型。Fibers是一種用戶態線程,由Java虛擬機(JVM)和運行時系統進行管理,不再需要映射到操作系統的本地線程。這樣,Fibers的創建和銷毀開銷將大大降低,并且可以在同一個操作系統線程內運行大量Fibers,從而減少內存消耗和提高性能。31j28資訊網——每日最新資訊28at.com

2、主要特性

Java Project Loom帶來了許多重要特性,其中最顯著的是:31j28資訊網——每日最新資訊28at.com

(1)Fibers(纖程)

Fibers是Java Project Loom的核心特性。它們是一種輕量級的、用戶態的線程實現,可以通過Fiber API進行創建、掛起、恢復和取消。與傳統線程相比,Fibers的創建和銷毀成本較低,并且可以高效地復用線程資源,使得應用程序可以擁有數千甚至數百萬個并發執行的Fibers,而不會產生顯著的內存開銷。31j28資訊網——每日最新資訊28at.com

(2)Continuations(續體)

為了支持Fibers,Java Project Loom引入了Continuations的概念。Continuations允許在Fiber被掛起時保存其執行狀態,并在需要時恢復到掛起的狀態。這為Fibers的掛起和恢復提供了一種高效的機制,避免了傳統線程上下文切換的開銷。31j28資訊網——每日最新資訊28at.com

(3)Virtual Threads(虛擬線程)

Java Project Loom還引入了Virtual Threads的概念,它是一種對Fibers進行透明封裝的機制。Virtual Threads可以根據應用程序的需求來動態地創建和管理Fibers,讓開發者可以使用簡單的編程模型處理大規模并發而無需擔心線程管理細節。31j28資訊網——每日最新資訊28at.com

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

Scoped Threads是Java Project Loom的另一個重要特性,它允許Fibers在有限的作用域內運行。這樣,Fiber在超出其作用域后將自動被銷毀,從而避免了資源泄漏和線程管理的復雜性。31j28資訊網——每日最新資訊28at.com

3、Project Loom的影響

Java Project Loom的推出將對Java開發者和應用程序產生深遠的影響:31j28資訊網——每日最新資訊28at.com

(1)更高的并發性能

通過引入輕量級的Fibers,Java Project Loom將使得Java應用程序可以更高效地處理大量并發任務,從而提供更高的并發性能和更好的可伸縮性。31j28資訊網——每日最新資訊28at.com

(2)更低的內存消耗

由于Fibers不再需要映射到操作系統的本地線程,Java應用程序的內存消耗將顯著降低,特別是在高并發場景下,這將對資源有限的環境和云計算平臺尤為重要。31j28資訊網——每日最新資訊28at.com

(3)更簡潔的代碼

Virtual Threads和Scoped Threads的引入將簡化并發編程的代碼邏輯,使得開發者可以更專注于業務邏輯而無需過多關注底層線程管理。31j28資訊網——每日最新資訊28at.com

(4)更好的響應性

Java Project Loom的改進將使得Java應用程序更具響應性,特別是在高負載和高并發情況下,應用程序仍然能夠快速響應用戶請求。31j28資訊網——每日最新資訊28at.com

總體而言,Java Project Loom是Java語言邁向更高并發性和更好性能的重要一步。通過引入Fibers和相關的特性,它將為Java開發者帶來更強大的工具,使得開發高效、高并發的Java應用程序變得更加容易。隨著Java生態系統的不斷發展,Java Project Loom必將成為Java開發中不可或缺的重要組成部分。31j28資訊網——每日最新資訊28at.com

4、Samples

許多應用程序不會直接使用 Thread API,而是使用
java.util.concurrent.ExecutorService和 Executors API。Executors API 已更新為 ExecutorServices 的新工廠方法,為每個任務啟動一個新線程。虛擬線程足夠便宜,可以為每個任務創建一個新的虛擬線程,永遠不需要池化虛擬線程。
31j28資訊網——每日最新資訊28at.com

下面啟動一個虛擬線程來打印消息。它調用join方法來等待線程終止。31j28資訊網——每日最新資訊28at.com

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

下面是一個在休眠后啟動虛擬線程將元素放入隊列的示例。主線程阻塞在隊列上,等待元素。31j28資訊網——每日最新資訊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”等的虛擬線程。31j28資訊網——每日最新資訊28at.com

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

以下示例使用 Executors API 創建一個 ExecutorService,為每個任務啟動一個新的虛擬線程。 該示例使用 try-with-resources 構造來確保 ExecutorService 在繼續之前已終止。31j28資訊網——每日最新資訊28at.com

ExecutorService定義了提交方法來執行任務。提交方法不會阻塞,而是返回一個可用于等待結果或異常的 Future 對象。接受任務集合的 Submit 方法會返回一個 Stream,該 Stream 會延遲填充代表結果的已完成的 Future 對象。31j28資訊網——每日最新資訊28at.com

該示例還使用 invokeAll 和invokeAny 組合器方法 來執行多個任務并等待它們完成。31j28資訊網——每日最新資訊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"));}


31j28資訊網——每日最新資訊28at.com

三、SpringBoot如何使用協程

1、Project Loom

Java Project Loom旨在改進Java虛擬機的執行模型,其中核心概念是Fibers,也稱為輕量級線程。Fibers提供了一種輕量級的線程模型,可以高效地創建和管理大量的并發任務,而不像傳統線程那樣消耗大量的系統資源。雖然Spring Boot本身沒有集成Project Loom,但可以在Spring Boot應用程序中使用Project Loom來實現協程。為此,你需要使用Java 17或更新版本,并引入Project Loom的依賴。31j28資訊網——每日最新資訊28at.com

以下是一個簡單的示例,展示如何使用Project Loom的Fibers來實現協程:31j28資訊網——每日最新資訊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應用程序中創建協程來處理并發任務。31j28資訊網——每日最新資訊28at.com

要使用Quasar,你需要將其作為依賴項添加到Spring Boot項目中。然后,你可以使用Quasar提供的API來創建、掛起和恢復協程。31j28資訊網——每日最新資訊28at.com

以下是一個簡單的示例,展示如何在Spring Boot應用程序中使用Quasar實現協程:31j28資訊網——每日最新資訊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();        }    }


31j28資訊網——每日最新資訊28at.com

四、第三方集成

1、Vert.x

Vert.x是一個基于事件驅動的響應式框架,它可以讓開發者使用Java或其他JVM語言編寫高性能的異步應用。Vert.x已經開始嘗試集成Java虛擬線程,目前有一個虛擬線程孵化器項目,它包含了一個async/await的實現。這個項目可以讓開發者使用類似于JavaScript或C#的語法來編寫異步代碼,而不需要使用回調或者Future31j28資訊網——每日最新資訊28at.com

31j28資訊網——每日最新資訊28at.com

Vert.x是一個用于構建響應式、高性能、可伸縮的應用程序的工具包和框架。它基于Java語言,提供了一個異步編程模型,使得開發者可以輕松地構建事件驅動的、非阻塞的應用程序。31j28資訊網——每日最新資訊28at.com

主要特點和優勢:31j28資訊網——每日最新資訊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值得一試。31j28資訊網——每日最新資訊28at.com

31j28資訊網——每日最新資訊28at.com

2、Jetty

Jetty是一個輕量級的Java web服務器和servlet容器。Jetty也已經支持了Java虛擬線程31j28資訊網——每日最新資訊28at.com

Java 19 中引入的虛擬線程在 Jetty 12 中受支持,因為它們分別從 10.11.10 和 0.12.11 開始在 Jetty 0 和 Jetty 12 中得到支持。31j28資訊網——每日最新資訊28at.com

當 JVM 支持虛擬線程并在 Jetty 中啟用時(請參閱嵌入式用法和獨立用法),將使用虛擬線程調用應用程序,這允許它們使用簡單的阻塞 API,但具有虛擬線程的可伸縮性優勢。31j28資訊網——每日最新資訊28at.com

3、Tomcat

31j28資訊網——每日最新資訊28at.com

Tomcat是一個廣泛使用的Java web服務器和servlet容器。Tomcat也支持Java虛擬線程,并在版本中有相關說明。31j28資訊網——每日最新資訊28at.com

4、Helidon

Helidon是一個微服務框架,它提供了兩種編程模型:Helidon SE和Helidon MP。Helidon SE是一個基于函數式編程的輕量級框架,它支持Reactive Streams和非阻塞IO。Helidon MP是一個基于標準化的注解驅動的框架,它支持MicroProfile API。Helidon也已經集成了Java虛擬線程,并提供了一些示例代碼來展示如何使用它。31j28資訊網——每日最新資訊28at.com

5、Quarkus

31j28資訊網——每日最新資訊28at.com

Quarkus是一個為云原生應用而生的全棧框架,它提供了高性能、低內存占用、快速啟動和熱重載等特性。Quarkus也已經支持了Java虛擬線程,并提供了一些文檔和指南來介紹如何使用它。31j28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-13589-0.html超越傳統線程:探索Java Loom協程(纖程/虛擬線程)的無限潛力

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Java遍歷一個 List 有哪些方式?每種的實現原理以及哪種最高效?

下一篇: 讓CSS官方后悔的一些決定

標簽:
  • 熱門焦點
Top