摘要:方法返回對象,如果任務(wù)被取消了則返回。如果任務(wù)沒有完成或者沒有拋出異常則返回。
一. Fork/Join
1 . 簡單介紹
a . Fork/Join為JKD1.7引入,適用于對大量數(shù)據(jù)進(jìn)行拆分成多個小任務(wù)進(jìn)行計算的框架,最后把所有小任務(wù)的結(jié)果匯總合并得到最終的結(jié)果
b . 相關(guān)類
public abstract class RecursiveTaskextends ForkJoinTask ; public abstract class RecursiveAction extends ForkJoinTask ;
c . 其中RecursiveTask在執(zhí)行有返回值的任務(wù)時使用,RecursiveAction在執(zhí)行沒有返回值的任務(wù)時使用
2 . 示例代碼
package com.evans; import com.sun.istack.internal.NotNull; import java.util.ArrayList; import java.util.List; import java.util.concurrent.*; /** * Created by Evans */ public class SumTask extends RecursiveTask{ //默認(rèn)任務(wù)計算限制 private int taskSize=100; //局部變量 private List sumList; public SumTask(@NotNull List list) { this.sumList=list; } public SumTask(@NotNull int taskSize,@NotNull List list) { this.taskSize = taskSize; this.sumList=list; } @Override protected Long compute() { if(this.sumList.size()<=this.taskSize){ //若集合數(shù)量小于限制值則直接計算 long sum = 0; for(Integer item :this.sumList){ sum += item; } System.out.println(String.format("Sum List[%d] = %d", this.sumList.size(), sum)); return sum; } // 任務(wù)大于限制值,則一分為二: int middle = (this.sumList.size()) / 2; System.out.println(String.format("Split Task List[%d] ==> List[%d], List[%d]", this.sumList.size(), this.sumList.size()-middle,middle)); SumTask subTask1 = new SumTask(this.taskSize,this.sumList.subList(0,middle)); SumTask subTask2 = new SumTask(this.taskSize,this.sumList.subList(middle,this.sumList.size())); invokeAll(subTask1, subTask2); Long subResult1 = subTask1.join(); Long subResult2 = subTask2.join(); Long result = subResult1 + subResult2; System.out.println("Sum Split Task Result = " + subResult1 + " + " + subResult2 + " ==> " + result); return result; } public static void main(String[] args) { //獲取當(dāng)前系統(tǒng)CPU核數(shù) int coreNumber = Runtime.getRuntime().availableProcessors(); List originalList = new ArrayList<>(); for(int i=0;i<100;i++){ originalList.add(i); } ForkJoinPool forkJoinPool = new ForkJoinPool(coreNumber); ForkJoinTask task = new SumTask(10, originalList); long startTime = System.currentTimeMillis(); Long result = 0L; //等待結(jié)果返回 result=forkJoinPool.invoke(task); //使用Future 獲取結(jié)果 // Future future = forkJoinPool.submit(task); // try { // result= future.get(); // } catch (InterruptedException e) { // e.printStackTrace(); // } catch (ExecutionException e) { // e.printStackTrace(); // } long endTime = System.currentTimeMillis(); System.out.println("Sum Task Result : " + result + " Cost Time : " + (endTime - startTime) + " ms."); forkJoinPool.shutdown(); } }
控制臺輸出
Split Task List[100] ==> List[50], List[50] Sum List[50] = 3725 Sum List[50] = 1225 Sum Split Task Result = 1225 + 3725 ==> 4950 Sum Task Result : 4950 Cost Time : 18 ms.
3 . 備注
a .在有大量計算任務(wù)時,此框架方法可進(jìn)行并行計算效率高,以上示例,可以根據(jù)具體的業(yè)務(wù)需求更改屬性及相關(guān)方法用于匹配自己的業(yè)務(wù)邏輯
b .JDK1.8后由于加入Stream流的操作,集合框架可以使用Collection
c .ForkJoinPool中的多種方法
publicForkJoinTask submit(ForkJoinTask task);//等待獲取結(jié)果 public void execute(ForkJoinTask> task);//異步執(zhí)行 public T invoke(ForkJoinTask task);//執(zhí)行,獲取Future
d .ForkJoinTask在執(zhí)行的時候可能會拋出異常,但是沒辦法在主線程里直接捕獲異常,所以ForkJoinTask提供了isCompletedAbnormally()方法來檢查任務(wù)是否已經(jīng)拋出異?;蛞呀?jīng)被取消了,并且可以通過ForkJoinTask的getException方法獲取異常。getException方法返回Throwable對象,如果任務(wù)被取消了則返回CancellationException。如果任務(wù)沒有完成或者沒有拋出異常則返回null。
if(task.isCompletedAbnormally()) { System.out.println(task.getException()); }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67403.html
摘要:對于任務(wù)的分割,要求各個子任務(wù)之間相互獨立,能夠并行獨立地執(zhí)行任務(wù),互相之間不影響。是叉子分叉的意思,即將大任務(wù)分解成并行的小任務(wù),是連接結(jié)合的意思,即將所有并行的小任務(wù)的執(zhí)行結(jié)果匯總起來。使用方法會阻塞并等待子任務(wù)執(zhí)行完并得到其結(jié)果。 Fork/Join是什么? Fork/Join框架是Java7提供的并行執(zhí)行任務(wù)框架,思想是將大任務(wù)分解成小任務(wù),然后小任務(wù)又可以繼續(xù)分解,然后每個小...
摘要:框架框架簡介框架是提供的一個用于并行執(zhí)行任務(wù)的框架,是一個把大任務(wù)分割成若干個小任務(wù),最終匯總每個小任務(wù)結(jié)果得到大任務(wù)結(jié)果的框架。框架實例需求計算的結(jié)果。 Fork/Join框架 1. Fork/Join框架簡介 Fork/Join框架是java7提供的一個用于并行執(zhí)行任務(wù)的框架,是一個把大任務(wù)分割成若干個小任務(wù),最終匯總每個小任務(wù)結(jié)果得到大任務(wù)結(jié)果的框架。Fork指的就是把一個大任務(wù)...
摘要:同時,它會通過的方法將自己注冊到線程池中。線程池中的每個工作線程都有一個自己的任務(wù)隊列,工作線程優(yōu)先處理自身隊列中的任務(wù)或順序,由線程池構(gòu)造時的參數(shù)決定,自身隊列為空時,以的順序隨機竊取其它隊列中的任務(wù)。 showImg(https://segmentfault.com/img/bVbizJb?w=1802&h=762); 本文首發(fā)于一世流云的專欄:https://segmentfau...
摘要:時,標(biāo)準(zhǔn)類庫添加了,作為對型線程池的實現(xiàn)。類圖用來專門定義型任務(wù)完成將大任務(wù)分割為小任務(wù)以及合并結(jié)果的工作。 JDK 1.7 時,標(biāo)準(zhǔn)類庫添加了 ForkJoinPool,作為對 Fork/Join 型線程池的實現(xiàn)。Fork 在英文中有 分叉 的意思,而 Join 有 合并 的意思。ForkJoinPool 的功能也是如此:Fork 將大任務(wù)分叉為多個小任務(wù),然后讓小任務(wù)執(zhí)行,Join...
摘要:并不會為每個任務(wù)都創(chuàng)建工作線程,而是根據(jù)實際情況構(gòu)造線程池時的參數(shù)確定是喚醒已有空閑工作線程,還是新建工作線程。 showImg(https://segmentfault.com/img/bVbiYSP?w=1071&h=707); 本文首發(fā)于一世流云的專欄:https://segmentfault.com/blog... 一、引言 前一章——Fork/Join框架(1) 原理,我們...
閱讀 2095·2021-11-02 14:48
閱讀 2771·2019-08-30 14:19
閱讀 2940·2019-08-30 13:19
閱讀 1308·2019-08-29 16:17
閱讀 3245·2019-08-26 14:05
閱讀 3000·2019-08-26 13:58
閱讀 3087·2019-08-23 18:10
閱讀 1114·2019-08-23 18:04