簡體   English   中英

Java 結構化並發

[英]Java structured concurrency

結構化並發:

一個簡單的原則,即當執行流分成多個並發流時,它們會在同一個代碼塊中重新加入。

資源

基於此,假設我有如下內容:

//can replace this with Virtual thread
public static void delegateTask() {
    Thread delegator = new Thread(new TaskDeligator());
    delegator.setName("TaskDeligatorThread");
    logger.info("Creating task delegator thread....which will register listeners");
    delegator.start();
}

問題 1:我創建了一個新的子線程( TaskDeligatorThread ),但沒有在同一個代碼塊中完成/結束/重新加入,即方法delegateTask() - 這是否意味着它不遵循結構化並發原則?

問題 2:可能存在 Thread1 想要將某些任務委托給子線程(Thread1 將創建)而 Thread1 不需要等待子線程的輸出/完成的情況。 在這種情況下,我再次不會在創建子線程的代碼塊中完成/結束/重新加入子線程。 在這種情況下,我將如何遵循結構化並發?

“在同一個代碼塊內”這個短語有點模棱兩可。

嚴格來說,您的main方法可以打開一個 StructuredExecutor 並使其可用於整個程序中的所有代碼,這樣您就可以使用庫對結構化並發的支持,而不是真正使用結構化並發。 (這大致類似於使用 for+switch 編寫意大利面條代碼,技術上不包含 'goto' 但相當於相同的東西。)

您的兩個示例都沒有遵循結構化並發原則,因為它們涉及分叉任務並放棄它。 您可以通過識別真正依賴於該任務的更高級別的調用者並讓該更高級別的調用者管理 StructuredExecutor 來重新設計它們以遵循該原則。 或者,您可能決定在一般情況下或在這些情況下都不想遵循此原則。

JEP 並沒有真正詳細解釋結構化並發的概念,因為它的主要重點是如何在 Java 中支持它。 如果您想了解這個概念本身,我建議您閱讀它鏈接到的一篇或兩篇博客文章:

(注意:前者技術性更強,后者更易於閱讀。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM