JUC入門(七)

14、ForkJoin

ForkJoin框架是Java中用于并行執行任務的框架,特別適合處理可以分解為多個子任務的復雜計算。它基于“分而治之”的思想,將一個大任務分解為多個小任務,這些小任務可以并行執行,最后將結果合并。

ForkJoin框架的核心組件

  1. ForkJoinPool:線程池,用于管理線程和任務的執行。

  2. RecursiveTask:有返回值的任務。

  3. RecursiveAction:無返回值的任務。

工作原理

  1. 任務分解:將大任務分解為多個小任務。

  2. 并行執行:小任務在ForkJoinPool中并行執行。

  3. 任務合并:將小任務的結果合并為最終結果。

  4. 工作竊取:線程池中的線程如果完成自己的任務,可以“竊取”其他線程的任務來執行,提高資源利用率。

代碼示例:計算斐波那契數列

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;public class FibonacciExample {// 定義一個閾值,當任務大小小于這個值時,直接計算而不是進一步分解private static final int THRESHOLD = 10;public static void main(String[] args) {// 創建ForkJoinPoolForkJoinPool forkJoinPool = new ForkJoinPool();// 提交任務FibonacciTask task = new FibonacciTask(30);int result = forkJoinPool.invoke(task);// 輸出結果System.out.println("Fibonacci(30) = " + result);}// 定義RecursiveTaskstatic class FibonacciTask extends RecursiveTask<Integer> {private final int n;public FibonacciTask(int n) {this.n = n;}@Overrideprotected Integer compute() {// 如果任務大小小于閾值,直接計算if (n <= THRESHOLD) {return computeFibonacci(n);} else {// 分解任務FibonacciTask leftTask = new FibonacciTask(n - 1);FibonacciTask rightTask = new FibonacciTask(n - 2);// 異步執行一個子任務leftTask.fork();// 執行另一個子任務int rightResult = rightTask.compute();// 等待第一個子任務完成并獲取結果int leftResult = leftTask.join();// 合并結果return leftResult + rightResult;}}// 計算斐波那契數列的值private int computeFibonacci(int n) {if (n <= 1) {return n;}return computeFibonacci(n - 1) + computeFibonacci(n - 2);}}
}

代碼解析

  1. ForkJoinPool

    • ForkJoinPoolForkJoin框架的核心,用于管理線程和任務的執行。在上面的代碼中,我們創建了一個ForkJoinPool實例。

    • 使用invoke方法提交任務并獲取結果。

  2. RecursiveTask

    • RecursiveTask是一個有返回值的任務類。在上面的代碼中,我們定義了一個FibonacciTask類,繼承自RecursiveTask<Integer>

    • compute方法中,我們實現了任務的分解和結果的合并。

  3. 任務分解

    • 如果任務大小小于閾值(THRESHOLD),直接計算結果。

    • 如果任務大小大于閾值,將任務分解為兩個子任務:F(n - 1)F(n - 2)

    • 使用fork方法異步執行一個子任務,使用compute方法同步執行另一個子任務。

    • 使用join方法等待異步執行的子任務完成并獲取結果。

  4. 結果合并

    • 將兩個子任務的結果相加,得到最終結果。

下面詳細闡述ForkJoin

. ForkJoinPool

ForkJoinPoolForkJoin框架的核心,用于管理線程和任務的執行。

構造方法
  • ForkJoinPool():創建一個默認的ForkJoinPool,其線程數量等于可用的處理器數量。

ForkJoinPool forkJoinPool = new ForkJoinPool();
  • ForkJoinPool(int parallelism):創建一個具有指定并行級別的ForkJoinPool
ForkJoinPool forkJoinPool = new ForkJoinPool(4); // 指定并行級別為4
常用方法
  • invoke(ForkJoinTask<?> task):執行給定的任務,等待其完成,并返回結果。
int result = forkJoinPool.invoke(new FibonacciTask(30));
  • execute(ForkJoinTask<?> task):異步執行給定的任務,不等待其完成。
forkJoinPool.execute(new FibonacciTask(30));
  • submit(ForkJoinTask<?> task):異步執行給定的任務,并返回一個ForkJoinTask對象,可以用來獲取結果。
ForkJoinTask<Integer> task = forkJoinPool.submit(new FibonacciTask(30));
int result = task.get(); // 獲取結果
  • shutdown():關閉線程池,不再接受新任務,但會等待已提交的任務完成。
forkJoinPool.shutdown();
  • shutdownNow():立即關閉線程池,嘗試取消所有未完成的任務。
forkJoinPool.shutdownNow();

RecursiveTask

構造方法
  • RecursiveTask():無參構造方法,通常在子類中使用。
public class FibonacciTask extends RecursiveTask<Integer> {private final int n;public FibonacciTask(int n) {this.n = n;}
}
常用方法
  • compute():任務的主體,用于執行任務的邏輯。可以在這個方法中分解任務并調用forkjoin方法。
@Override
protected Integer compute() {if (n <= THRESHOLD) {return computeFibonacci(n);} else {FibonacciTask leftTask = new FibonacciTask(n - 1);FibonacciTask rightTask = new FibonacciTask(n - 2);leftTask.fork();int rightResult = rightTask.compute();int leftResult = leftTask.join();return leftResult + rightResult;}
}
  • fork():異步執行當前任務,返回一個ForkJoinTask對象。
leftTask.fork();
  • join():等待任務完成并獲取結果。如果任務已經完成,直接返回結果。

RecursiveAction

RecursiveAction是一個無返回值的任務類,用于表示可以分解為多個子任務的任務。

構造方法
  • RecursiveAction():無參構造方法,通常在子類中使用。
public class SortTask extends RecursiveAction {private final int[] array;private final int start;private final int end;public SortTask(int[] array, int start, int end) {this.array = array;this.start = start;this.end = end;}
}
常用方法
  • compute():任務的主體,用于執行任務的邏輯。可以在這個方法中分解任務并調用forkjoin方法。
@Override
protected void compute() {if (end - start < THRESHOLD) {Arrays.sort(array, start, end);} else {int middle = (start + end) / 2;SortTask leftTask = new SortTask(array, start, middle);SortTask rightTask = new SortTask(array, middle, end);leftTask.fork();rightTask.compute();leftTask.join();}
}
  • fork():異步執行當前任務。
leftTask.fork();
  • join():等待任務完成。由于RecursiveAction沒有返回值,join方法不返回任何結果。
leftTask.join();

總結

ForkJoin框架提供了多種方法來支持任務的分解、執行和結果合并。通過合理使用這些方法,可以高效地處理復雜的并行計算任務。以下是一些關鍵點:

  • ForkJoinPool:用于管理線程和任務的執行。

  • RecursiveTask:有返回值的任務類,適用于需要返回結果的任務。

  • RecursiveAction:無返回值的任務類,適用于不需要返回結果的任務。

  • compute():任務的主體,用于實現任務的邏輯。

  • fork():異步執行任務。

  • join():等待任務完成并獲取結果(對于RecursiveTask)或等待任務完成(對于RecursiveAction)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/84166.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84166.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/84166.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第 7 章:綜合回顧與性能優化

本章目標: 系統化地回顧各類外設接口選型原則 深入探討多接口并存時的資源沖突與管理策略 掌握軟硬件協同的性能分析方法,快速定位并消除瓶頸 總結一整套從架構設計到現場調試的最佳實踐與防坑指南 7.1 綜合選型決策矩陣(深度分析) 除了前文的基礎矩陣,這里引入兩個更細化…

交換機的連接方式堆疊和級聯

以下是交換機的堆疊和級聯各自的優缺點總結&#xff0c;幫助快速對比選擇&#xff1a; ?一、堆疊&#xff08;Stacking&#xff09;? ?優點 ?高性能 堆疊鏈路帶寬高&#xff08;如10G/40G/100G&#xff09;&#xff0c;成員間數據通過背板直連&#xff0c;無帶寬瓶頸。支…

C++高效求解非線性方程組的實踐指南

非線性方程組的求解是科學與工程計算中的核心問題之一&#xff0c;涉及物理建模、機器學習、金融分析等多個領域。C因其高性能和底層控制能力成為此類問題的首選語言&#xff0c;但如何高效實現求解仍存在諸多挑戰。本文從算法選擇、工具應用、穩定性優化及性能提升四個維度&am…

2025年- H42-Lc150 --146. LRU緩存(哈希表,雙鏈表)需二刷--Java版

1.題目描述 2.思路 LRU(最近最少使用&#xff09;&#xff1a;如果緩存的容量為2&#xff0c;剛開始的兩個元素都入棧。之后該2元素中有其中一個元素&#xff08;重點元素&#xff09;被訪問。把最近訪問過的重點元素保留&#xff0c;另一個邊緣元素就得離開緩存了。 下面是l…

5G 網絡中 DNN 的深度解析:從基礎概念到核心應用

摘要 本文深度剖析 5G 網絡中 DNN(數據網絡名稱)的核心作用與運行機制,從基礎概念入手,詳細闡述 DNN 在會話管理、用戶面資源分配、切片選擇等方面的關鍵功能。通過實際應用場景分析與技術實現細節探討,揭示 DNN 如何助力 5G 網絡滿足多樣化業務需求,為 5G 網絡部署、優…

MLpack 開源庫介紹與使用指南

MLpack 開源庫介紹與使用指南 1. MLpack 簡介 MLpack 是一個快速、靈活的 C 機器學習庫&#xff0c;專注于可擴展性、速度和易用性。它提供了大量經典的機器學習算法實現&#xff0c;包括&#xff1a; 監督學習&#xff08;分類、回歸&#xff09;無監督學習&#xff08;聚類…

Python版scorecardpy庫woebin函數使用

scorecardpy 是一款專門用于評分卡模型開發的 Python 庫&#xff0c;由謝士晨博士開發&#xff0c;該軟件包是R軟件包評分卡的Python版本。量級較輕&#xff0c;依賴更少&#xff0c;旨在簡化傳統信用風險計分卡模型的開發過程&#xff0c;使這些模型的構建更加高效且易于操作。…

英語寫作中“假設”suppose, assume, presume 的用法

一、suppose 是給出推理的前提&#xff0c;與事實無關&#xff0c;例如&#xff1a; Suppose x >0. Then the square root of x is a real number. &#xff08;假設x大于0&#xff0c;則x的平方根是實數。&#xff09; Suppose Jack and Alice share a private channel. …

CAD標注樣式如何設置?詳細教程來了

CAD中有很多的標注&#xff0c;比如線性標注&#xff0c;對齊標注&#xff0c;坐標標注&#xff0c;面積標注&#xff0c;直徑標注&#xff0c;弧長標注等等&#xff0c;標注的種類多&#xff0c;標注的樣式也多&#xff0c;今天來給大家介紹一下浩辰CAD看圖王中如何設置不同的…

vscode include總是報錯

VSCode 的 C/C 擴展可以通過配置 c_cpp_properties.json 來使用 compile_commands.json 文件中的編譯信息&#xff0c;包括 include path、編譯選項等。這樣可以確保 VSCode 的 IntelliSense 與實際編譯環境保持一致。 方法一&#xff1a;直接指定 compile_commands.json 路徑…

自動化立體倉庫WCS與PLC通訊設計規范

導語 大家好&#xff0c;我是社長&#xff0c;老K。專注分享智能制造和智能倉儲物流等內容。歡迎大家使用我們的倉儲物流技術AI智能體。 新書《智能物流系統構成與技術實踐》 新書《智能倉儲項目出海-英語手冊&#xff0c;必備&#xff01;》 完整版文件和更多學習資料&#xf…

【window QT開發】簡易的對稱密鑰加解密工具(包含圖形應用工具和命令行工具)

前言 項目開發時&#xff0c;配置文件中某些信息不適合直接明文顯示&#xff0c;本文提供基于對稱密鑰的AES-256算法的加解密工具&#xff0c;可集成到項目中。 AES講解 以下是我分享的一個在國產信創系統(Linux)下使用openssl實現AES加解密的博文 對稱加密--AES加解密 本文…

「極簡」扣子(coze)教程 | 小程序UI設計進階(二)!讓系統動起來,“禁用”,“加載”狀態設置

大家好&#xff0c;上一期大師兄通過一個例子來介紹一下扣子界面中“可見性”的應用。今天大師兄想再進一步介紹控件中的其他一些重要的屬性。 扣子&#xff08;coze&#xff09;編程 「極簡」扣子(coze)教程 | 小程序UI設計進階&#xff01;控件可見性設置 「極簡」扣子(coze…

前端三件套之html詳解

目錄 一 認識 二 標簽的分類 三 標簽 body標簽 標題標簽 段落標簽 換行標簽 水平分割線 文本格式化標簽 圖片標簽 音頻標簽 鏈接標簽 列表標簽 表格標簽 表單標簽 input標簽 下拉菜單標簽 textarea文本域標簽 label標簽 語義化標簽 button標簽 字符實體 …

Google Play 賬號創建及材料準備

1&#xff1a;注冊一個關聯Google Play賬號的Google賬號&#xff0c;關聯郵箱進行自動轉發 2&#xff1a;準備一張Visa、Master、JCB、運通卡或Discover等美國信用卡或全球付虛擬信用卡&#xff0c;用來支付25美金的GP賬號注冊費 3&#xff1a;為避免出現關聯原因被封&#x…

Pycharm和Flask的學習心得(4和5)

一&#xff1a;認識路由&#xff1a; &#xff08;1&#xff09;&#xff1a;接受請求的類型&#xff1a; app.route(hello ,methods [GET ,POST]) 請求類型主要有兩種(常用)&#xff1a;GET 和 POST ; GET: 直接輸入的網址&#xff08;url訪問的就是GET請求&#xff09; …

DeepSeek 賦能智能電網:從技術革新到全場景應用實踐

目錄 一、智能電網的發展現狀與挑戰二、DeepSeek 技術解析2.1 DeepSeek 技術原理2.2 DeepSeek 技術優勢 三、DeepSeek 在智能電網中的具體應用3.1 設備管理智能化3.2 電網運行優化3.3 客戶服務提升3.4 規劃建設智能化3.5 經營管理高效化3.6 辦公輔助便捷化 四、DeepSeek 在智能…

MFC 編程中 OnInitDialog 函數

核心作用 對話框初始化入口 &#xff1a;創建完成后第一個執行的函數。是對話框的起點。控件操作安全期 &#xff1a;此時所有控件已創建完成。可以安全地進行控件的初始化、屬性設置等操作。界面布局最佳時機 &#xff1a;窗口顯示前完成初始化設置。可以進行布局調整、數據初…

前端地圖數據格式標準及應用

前端地圖數據格式標準及應用 坐標系EPSGgeojson標準格式基于OGC標準的地圖服務shapefile文件3D模型數據常見地圖框架 坐標系EPSG EPSG&#xff08;European Petroleum Survey Group&#xff09;是一個國際組織&#xff0c;負責維護和管理地理坐標系統和投影系統的標準化編碼 E…

Python爬蟲(35)Python爬蟲高階:基于Docker集群的動態頁面自動化采集系統實戰

目錄 一、技術演進與行業痛點二、核心技術棧深度解析2.1 動態渲染三件套2.2 Docker集群架構設計2.3 自動化調度系統 三、進階實戰案例3.1 電商價格監控系統1. 技術指標對比2. 實現細節 3.2 新聞聚合平臺1. WebSocket監控2. 字體反爬破解 四、性能優化與運維方案4.1 資源消耗對比…