java8之ForkJoin框架的使用
forkjoin框架最基本的介紹
package com.lyzx.concurrent.threadPool;
import java.util.concurrent.*;
/**
* 分支合併執行緒池(mapReduce 類似的設計思想)。適合用於處理複雜任務。
* 初始化執行緒容量與 CPU 核心數相關。
* 執行緒池中執行的內容必須是 ForkJoinTask 的子型別(RecursiveTask,RecursiveAction)。
* ForkJoinPool - 分支合併執行緒池。 可以遞迴完成複雜任務。 要求可分支合併的任務必須
* 是 ForkJoinTask 型別的子型別。 其中提供了分支和合並的能力。 ForkJoinTask 型別提供了兩個
* 抽象子型別, RecursiveTask 有返回結果的分支合併任務,RecursiveAction 無返回結果的分支合併任務。(
* Callable/Runnable) compute 方法:就是任務的執行邏輯。
* ForkJoinPool 沒有所謂的容量。預設都是 1 個執行緒。根據任務自動的分支新的子執行緒。
* 當子執行緒任務結束後,自動合併。 所謂自動是根據 fork 和 join 兩個方法實現的。
* 應用: 主要是做科學計算或天文計算的。 資料分析的。
*/
public class ForkJoinPoolTest{
public static void main(String[] args) throws ExecutionException, InterruptedException {
long[] arr = new long[20000];
for(int i=0;i<arr.length;i++){
arr[i]=i;
}
ForkJoinPool pool = new ForkJoinPool();
JoinTask task = new JoinTask(arr,0,arr.length,50);
Future<Long> future = pool.submit(task);
System.out.println(future.get());
}
}
class JoinTask extends RecursiveTask<Long>{
private int start,end;
private long[] arr;
private int target;
public JoinTask(long[] arr,int start,int end,int target){
this.arr = arr;
this.start = start;
this.end = end;
this.target = target;
}
@Override
protected Long compute() {
/**
* 如果分配的陣列大小達到了指定的大小就執行相加的操作
* 否則就繼續拆分
*/
if(end - start <= target){
Long result = 0L;
for(int i=start;i<end;i++){
result+= arr[i];
}
return result;
}else{
int mid = start + (end - start)/2;
JoinTask j1 = new JoinTask(arr,start,mid,target);
JoinTask j2 = new JoinTask(arr,mid,end,target);
//fork()方法時繼續查分即會繼續呼叫compute方法
j1.fork();
j2.fork();
return j1.join()+j2.join();
}
}
}
相關文章
- ForkJoin框架框架
- ForkJoin框架的RecursiveTask和ForkJoinPool的使用案例框架
- 併發程式設計之:ForkJoin程式設計
- 併發程式設計:DEMO:比較Stream和forkjoin框架的效率程式設計框架
- java8之後的介面Java
- Java8的Stream API使用JavaAPI
- 多執行緒系列(二十一) -ForkJoin使用詳解執行緒
- Mockserver之Moco框架搭建使用MockServer框架
- Java併發程式設計ForkJoin的DemoJava程式設計
- Golang實現ForkJoin小文Golang
- Java8新特性之:OptionalJava
- Java8 Lambda 之 Collection StreamJava
- 淺談java8中的流的使用Java
- 六問六答理解ForkJoin原理
- Java8之Stream-強大的collect操作Java
- ?Java8新特性之Optional類Java
- Java8之Stream常用操作方式Java
- java8 新特性之方法引用Java
- java8 新特性之Optional 類Java
- java8預設使用的垃圾收集器Java
- 如何正確使用Java8的Optional機制Java
- Java8新特性之時間APIJavaAPI
- Java8新特性探索之Stream介面Java
- java8 新特性之Lambda 表示式Java
- java8 新特性之預設方法Java
- Java8 Stream完全使用指南Java
- java8的新特性之lambda表示式和方法引用Java
- Webpack之before快速建立介面(框架快速使用)Web框架
- Java8中的流操作-基本使用&效能測試Java
- 使用java8的方法引用替換硬編碼Java
- java8 新特性之函式式介面Java函式
- Java8之Stream-函式式介面Java函式
- Java8之Stream流(三)縮減操作Java
- 學好Python不加班系列之SCRAPY爬蟲框架的使用Python爬蟲框架
- BootStrap框架的使用boot框架
- Java8學習之路-Java8的發展Java
- ForkJoin和氣泡排序組合實現的歸併排序排序
- list轉map,使用java8,stream流Java