Java多線程高并發(fā)中的Fork/Join框架機(jī)制詳解
1.Fork/Join框架簡(jiǎn)介
Fork/Join 它可以將一個(gè)大的任務(wù)拆分成多個(gè)子任務(wù)進(jìn)行并行處理,最后將子任務(wù)結(jié)果合并成最后的計(jì)算結(jié)果,并進(jìn)行輸出。Fork/Join 框架要完成兩件事情:
Fork:把一個(gè)復(fù)雜任務(wù)進(jìn)行分拆,大事化小 :把一個(gè)復(fù)雜任務(wù)進(jìn)行分拆,大事化小
Join:把分拆任務(wù)的結(jié)果進(jìn)行合并

在 Java 的 Fork/Join 框架中,使用兩個(gè)類完成上述操作:
ForkJoinTask: 我們要使用 Fork/Join 框架,首先需要?jiǎng)?chuàng)建一個(gè) ForkJoin 任務(wù)。該類提供了在任務(wù)中執(zhí)行 fork 和 join 的機(jī)制。通常情況下我們不需要直接集成 ForkJoinTask 類,只需要繼承它的子類,F(xiàn)ork/Join 框架提供了兩個(gè)子類:
- RecursiveAction:用于沒(méi)有返回結(jié)果的任務(wù)
- RecursiveTask:用于有返回結(jié)果的任務(wù)
ForkJoinPool: ForkJoinTask 需要通過(guò) ForkJoinPool 來(lái)執(zhí)行。
RecursiveTask: 繼承后可以實(shí)現(xiàn)遞歸(自己調(diào)自己)調(diào)用的任務(wù)。
可以在jdk官方文檔中看到:

2.簡(jiǎn)單應(yīng)用
實(shí)現(xiàn)從 1 + 2 + ... + 100 ,將它們拆分成多個(gè)小任務(wù),分別求和,最終再將這些結(jié)果合并。
這里就是參照官方文檔,先繼承RecursiveTask類,重寫其中的compute方法,然后定義有參構(gòu)造,而ForkJoinTask需要通過(guò) ForkJoinPool 來(lái)執(zhí)行,所以還需要?jiǎng)?chuàng)建 分支合并池ForkJoinPool對(duì)象。
package test.forkjoin;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
/**
*
*/
class MyTask extends RecursiveTask<Integer> {
//拆分差值不能超過(guò)10,每次計(jì)算10以內(nèi)的連加操作
private static final Integer NUMBER = 10;
private int begin; //拆分左區(qū)間的值
private int end; //拆分右區(qū)間的值
private int result; //最終結(jié)果
public MyTask(int begin,int end) {
this.begin = begin;
this.end = end;
}
@Override
protected Integer compute() {
//判斷區(qū)間差值是否大于10
if ((end - begin) <= NUMBER) {
//將區(qū)間內(nèi)的值依次相加
for (int i = begin; i <= end; i++) {
result += i;
}
} else { //區(qū)間差值大于10,進(jìn)一步拆分
//獲取中間值
int middle = (begin + end) / 2;
//拆分的左區(qū)間
MyTask taskLeft = new MyTask(begin,middle);
//拆分的右區(qū)間
MyTask taskRight = new MyTask(middle + 1,end);
//fork方法進(jìn)行拆分
taskLeft.fork();
taskRight.fork();
//join方法進(jìn)行合并
result = taskLeft.join() + taskRight.join();
}
return result;
}
}
public class ForkJoinDemo {
public static void main(String[] args) {
//創(chuàng)建MyTask對(duì)象
MyTask myTask = new MyTask(1,100);
//創(chuàng)建分支合并池對(duì)象
ForkJoinPool forkJoinPool = new ForkJoinPool();
ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(myTask);
try {
//獲取最終合并后的結(jié)果
Integer ans = forkJoinTask.get();
System.out.println(ans);
} catch (Exception e) {
e.printStackTrace();
}finally {
//關(guān)閉池對(duì)象
forkJoinPool.shutdown();
}
}
}

到此這篇關(guān)于Java多線程高并發(fā)中的Fork/Join框架機(jī)制詳解的文章就介紹到這了,更多相關(guān)Java Fork/Join 框架內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java統(tǒng)計(jì)文件中每個(gè)字符出現(xiàn)的個(gè)數(shù)
這篇文章主要為大家詳細(xì)介紹了java統(tǒng)計(jì)文件中每個(gè)字符出現(xiàn)的個(gè)數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03
解析Mybatis Porxy動(dòng)態(tài)代理和sql解析替換問(wèn)題
這篇文章主要介紹了Mybatis Porxy動(dòng)態(tài)代理和sql解析替換,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
OPENCV+JAVA實(shí)現(xiàn)人臉識(shí)別
這篇文章主要為大家詳細(xì)介紹了OPENCV+JAVA實(shí)現(xiàn)人臉識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
java實(shí)現(xiàn)對(duì)excel文件的處理合并單元格的操作
這篇文章主要介紹了java實(shí)現(xiàn)對(duì)excel文件的處理合并單元格的操作,開頭給大家介紹了依賴引入代碼,表格操作的核心代碼,代碼超級(jí)簡(jiǎn)單,需要的朋友可以參考下2021-07-07
Java詳細(xì)分析String類與StringBuffer和StringBuilder的使用方法
當(dāng)對(duì)字符串進(jìn)行修改的時(shí)候,需要使用 StringBuffer 和 StringBuilder類,和String類不同的是,StringBuffer和 StringBuilder類的對(duì)象能夠被多次的修改,并且不產(chǎn)生新的未使用對(duì)象2022-04-04
關(guān)于@RequestParam的使用所遇到的404問(wèn)題
這篇文章主要介紹了關(guān)于@RequestParam的使用所遇到的404問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Java使用Statement接口執(zhí)行SQL語(yǔ)句操作實(shí)例分析
這篇文章主要介紹了Java使用Statement接口執(zhí)行SQL語(yǔ)句操作,結(jié)合實(shí)例形式詳細(xì)分析了Java使用Statement接口針對(duì)mysql數(shù)據(jù)庫(kù)進(jìn)行連接與執(zhí)行SQL語(yǔ)句增刪改查等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-07-07
常用的Java數(shù)據(jù)結(jié)構(gòu)知識(shí)點(diǎn)匯總
這篇文章主要介紹了常用的Java數(shù)據(jù)結(jié)構(gòu)知識(shí)點(diǎn)匯總,數(shù)據(jù)結(jié)構(gòu)分線性數(shù)據(jù)結(jié)構(gòu)和非線性數(shù)據(jù)結(jié)構(gòu),下面對(duì)此作詳細(xì)介紹,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)或工作有所幫助2022-03-03
使用WebUploader實(shí)現(xiàn)上傳文件功能(一)
這篇文章主要為大家詳細(xì)介紹了使用WebUploader實(shí)現(xiàn)上傳文件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01

