JEP 428:針對JDK 19提出的結構化併發

banq發表於2022-05-27

Java開發人員透過將任務分解為多個子任務來管理複雜性。在普通的單執行緒程式碼中,子任務按順序執行。但是,如果子任務彼此足夠獨立,並且有足夠的硬體資源,則可以透過併發執行子任務來使任務執行得更快(延遲更低) 。例如,如果每個 I/O 操作都在自己的執行緒中執行,則由多個 I/O 操作的結果組成的任務將執行得更快。

虛擬執行緒的可用性使得將執行緒專用於每個 I/O 操作具有成本效益。

透過引入結構化併發庫來簡化多執行緒程式設計。結構化併發將在不同執行緒中執行的多個任務視為單個工作單元,從而簡化錯誤處理和取消,提高可靠性並增強可觀察性。

目標

  • 提高多執行緒程式碼的可靠性和可觀察性。
  • 提倡一種併發程式設計風格,可以消除取消和關閉帶來的常見風險,例如執行緒洩漏和取消延遲。


結構化併發是一種多執行緒程式設計方法,它保留了單執行緒程式碼開發人員所享有的可讀性和可維護性。它的原理是,如果一個任務拆分成併發的子任務,它們都返回到同一個地方:任務的程式碼塊。

Response handle() throws ExecutionException, InterruptedException {
    try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
        Future<String>  user  = scope.fork(() -> findUser()); 
        Future<Integer> order = scope.fork(() -> fetchOrder());

        scope.join();          // Join both forks
        scope.throwIfFailed(); // ... and propagate errors

        // Here, both forks have succeeded, so compose their results
        return new Response(user.resultNow(), order.resultNow());
    }
}


在所有條件下,生命週期都被限制在一個詞法範圍內:try-with-resources 的主體。

 

相關文章