Java并發(fā)編程之Fork/Join框架的理解
一、Fork/Join框架的理解

- ForkJoinTask類屬于java.util.concurrent 包下;
- ForkJoinTask類下有2個(gè)子類,分別為RecursiveTask和RecursiveAction類;(lz示例中使用RecursiveTask類進(jìn)行重寫compute()方法進(jìn)行實(shí)現(xiàn)數(shù)值的累加計(jì)算)
- ForkJoinTask類 將一個(gè)大的任務(wù)拆分成多個(gè)子任務(wù)進(jìn)行并行處理,最后將子任務(wù)結(jié)果合并成最后的計(jì)算結(jié)果,并進(jìn)行輸出。


二、Fork/Join框架使用示例
示例場(chǎng)景:對(duì)數(shù)值進(jìn)行累加計(jì)算;
注:示例中使用ForkJoinTask類的子類(RecursiveTask類)進(jìn)行重寫compute()方法進(jìn)行實(shí)現(xiàn)數(shù)值的累加計(jì)算
1、代碼
package com.xz.thread.ForkJoin;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
/**
* @description:
* @author: xz
* @create: 2021-06-06 17:15
*/
public class Demo extends RecursiveTask<Integer> {
private int start;//子任務(wù)開始計(jì)算的開始值
private int end;//子任務(wù)開始計(jì)算的結(jié)束值
private static final Integer MAX_VALUE = 50;
//構(gòu)造方法
public Demo(int start, int end) {
this.start = start;
this.end = end;
}
//計(jì)算
@Override
protected Integer compute() {
int sum =0;
//如果所需要計(jì)算的數(shù)值拆分為足夠小,則進(jìn)行累加計(jì)算
if(end-start <= MAX_VALUE){
System.out.println("startValue = " + start + ";endValue = " + end);
for(int i=start;i<=end;i++){
sum +=i;
}
}else{//否則再進(jìn)行任務(wù)拆分,拆分成2個(gè)子任務(wù)
Demo d1 = new Demo(start, (start + end) / 2);
Demo d2 = new Demo((start + end) / 2, end);
//執(zhí)行2個(gè)子任務(wù)
d1.fork();
d2.fork();
//合并子任務(wù)
Integer value1= d1.join();
Integer value2= d2.join();
sum =value1+value2;
}
return sum;
}
//測(cè)試
public static void main(String[] args) throws Exception{
//ForkJoinPool主要用于實(shí)現(xiàn)“分而治之”的算法,特別是分治之后遞歸調(diào)用的函數(shù)
ForkJoinPool forkJoinPool = new ForkJoinPool();
//提交一個(gè)ForkJoinTask執(zhí)行
ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(new Demo(1,200));
System.out.println("計(jì)算結(jié)果="+forkJoinTask.get());
}
}
2、運(yùn)行測(cè)方法,輸出如下:

3、結(jié)論:
由第2步驟的輸出結(jié)果可知,先把1到200的所有數(shù)值進(jìn)行任務(wù)拆分(上圖拆分成了4部分),然后再將所有子任務(wù)結(jié)的果合并成最后的計(jì)算結(jié)果
到此這篇關(guān)于Java并發(fā)編程之Fork/Join框架的理解的文章就介紹到這了,更多相關(guān)Fork/Join框架的理解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot實(shí)現(xiàn)后臺(tái)上傳圖片(工具類)
這篇文章主要為大家詳細(xì)介紹了springboot實(shí)現(xiàn)后臺(tái)上傳圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04
Spring AOP實(shí)現(xiàn)Redis緩存數(shù)據(jù)庫查詢?cè)创a
這篇文章主要介紹了Spring AOP實(shí)現(xiàn)Redis緩存數(shù)據(jù)庫查詢的相關(guān)內(nèi)容,源碼部分還是不錯(cuò)的,需要的朋友可以參考下。2017-09-09
解決idea 通過build project 手動(dòng)觸發(fā)熱部署失敗的問題
在debug運(yùn)行項(xiàng)目的過程中,并且保證(不添加方法,不修改方法名)一定的規(guī)則的情況下,可以通過build project 來手動(dòng)熱部署項(xiàng)目,本文給大家介紹解決idea 通過build project 手動(dòng)觸發(fā)熱部署失敗的問題,感興趣的朋友一起看看吧2023-12-12
Maven中<distributionManagement>的使用及說明
本文主要介紹了Maven中的SNAPSHOT和RELEASE倉(cāng)庫的區(qū)別,以及如何在POM文件中配置和使用快照版本,快照版本可以實(shí)現(xiàn)實(shí)時(shí)更新,方便開發(fā)過程中的依賴管理,同時(shí),本文還總結(jié)了Maven的一些常用命令及其作用2025-01-01
SpringBoot自動(dòng)裝配之Condition深入講解
@Conditional表示僅當(dāng)所有指定條件都匹配時(shí),組件才有資格注冊(cè)。該@Conditional注釋可以在以下任一方式使用:作為任何@Bean方法的方法級(jí)注釋、作為任何類的直接或間接注釋的類型級(jí)別注釋@Component,包括@Configuration類、作為元注釋,目的是組成自定義構(gòu)造型注釋2023-01-01
SpringBoot中@Scheduled()注解以及cron表達(dá)式詳解
這篇文章主要介紹了SpringBoot中@Scheduled()注解以及cron表達(dá)式詳解,@Scheduled注解是Spring Boot提供的用于定時(shí)任務(wù)控制的注解,主要用于控制任務(wù)在某個(gè)指定時(shí)間執(zhí)行,或者每隔一段時(shí)間執(zhí)行,需要的朋友可以參考下2023-08-08
如何基于SpringMVC實(shí)現(xiàn)斷點(diǎn)續(xù)傳(HTTP)
這篇文章主要介紹了如何基于SpringMVC實(shí)現(xiàn)斷點(diǎn)續(xù)傳(HTTP),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01

