摘要:方法返回對(duì)象,如果任務(wù)被取消了則返回。如果任務(wù)沒有完成或者沒有拋出異常則返回。
一. Fork/Join
1 . 簡(jiǎn)單介紹
a . Fork/Join為JKD1.7引入,適用于對(duì)大量數(shù)據(jù)進(jìn)行拆分成多個(gè)小任務(wù)進(jìn)行計(jì)算的框架,最后把所有小任務(wù)的結(jié)果匯總合并得到最終的結(jié)果
b . 相關(guān)類
public abstract class RecursiveTaskextends ForkJoinTask ; public abstract class RecursiveAction extends ForkJoinTask ;
c . 其中RecursiveTask在執(zhí)行有返回值的任務(wù)時(shí)使用,RecursiveAction在執(zhí)行沒有返回值的任務(wù)時(shí)使用
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ù)計(jì)算限制 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ù)量小于限制值則直接計(jì)算 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(); } }
控制臺(tái)輸出
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 .在有大量計(jì)算任務(wù)時(shí),此框架方法可進(jìn)行并行計(jì)算效率高,以上示例,可以根據(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í)行的時(shí)候可能會(huì)拋出異常,但是沒辦法在主線程里直接捕獲異常,所以ForkJoinTask提供了isCompletedAbnormally()方法來檢查任務(wù)是否已經(jīng)拋出異常或已經(jīng)被取消了,并且可以通過ForkJoinTask的getException方法獲取異常。getException方法返回Throwable對(duì)象,如果任務(wù)被取消了則返回CancellationException。如果任務(wù)沒有完成或者沒有拋出異常則返回null。
if(task.isCompletedAbnormally()) { System.out.println(task.getException()); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/67403.html
摘要:對(duì)于任務(wù)的分割,要求各個(gè)子任務(wù)之間相互獨(dú)立,能夠并行獨(dú)立地執(zhí)行任務(wù),互相之間不影響。是叉子分叉的意思,即將大任務(wù)分解成并行的小任務(wù),是連接結(jié)合的意思,即將所有并行的小任務(wù)的執(zhí)行結(jié)果匯總起來。使用方法會(huì)阻塞并等待子任務(wù)執(zhí)行完并得到其結(jié)果。 Fork/Join是什么? Fork/Join框架是Java7提供的并行執(zhí)行任務(wù)框架,思想是將大任務(wù)分解成小任務(wù),然后小任務(wù)又可以繼續(xù)分解,然后每個(gè)小...
摘要:框架框架簡(jiǎn)介框架是提供的一個(gè)用于并行執(zhí)行任務(wù)的框架,是一個(gè)把大任務(wù)分割成若干個(gè)小任務(wù),最終匯總每個(gè)小任務(wù)結(jié)果得到大任務(wù)結(jié)果的框架。框架實(shí)例需求計(jì)算的結(jié)果。 Fork/Join框架 1. Fork/Join框架簡(jiǎn)介 Fork/Join框架是java7提供的一個(gè)用于并行執(zhí)行任務(wù)的框架,是一個(gè)把大任務(wù)分割成若干個(gè)小任務(wù),最終匯總每個(gè)小任務(wù)結(jié)果得到大任務(wù)結(jié)果的框架。Fork指的就是把一個(gè)大任務(wù)...
摘要:同時(shí),它會(huì)通過的方法將自己注冊(cè)到線程池中。線程池中的每個(gè)工作線程都有一個(gè)自己的任務(wù)隊(duì)列,工作線程優(yōu)先處理自身隊(duì)列中的任務(wù)或順序,由線程池構(gòu)造時(shí)的參數(shù)決定,自身隊(duì)列為空時(shí),以的順序隨機(jī)竊取其它隊(duì)列中的任務(wù)。 showImg(https://segmentfault.com/img/bVbizJb?w=1802&h=762); 本文首發(fā)于一世流云的專欄:https://segmentfau...
摘要:時(shí),標(biāo)準(zhǔn)類庫添加了,作為對(duì)型線程池的實(shí)現(xiàn)。類圖用來專門定義型任務(wù)完成將大任務(wù)分割為小任務(wù)以及合并結(jié)果的工作。 JDK 1.7 時(shí),標(biāo)準(zhǔn)類庫添加了 ForkJoinPool,作為對(duì) Fork/Join 型線程池的實(shí)現(xiàn)。Fork 在英文中有 分叉 的意思,而 Join 有 合并 的意思。ForkJoinPool 的功能也是如此:Fork 將大任務(wù)分叉為多個(gè)小任務(wù),然后讓小任務(wù)執(zhí)行,Join...
摘要:并不會(huì)為每個(gè)任務(wù)都創(chuàng)建工作線程,而是根據(jù)實(shí)際情況構(gòu)造線程池時(shí)的參數(shù)確定是喚醒已有空閑工作線程,還是新建工作線程。 showImg(https://segmentfault.com/img/bVbiYSP?w=1071&h=707); 本文首發(fā)于一世流云的專欄:https://segmentfault.com/blog... 一、引言 前一章——Fork/Join框架(1) 原理,我們...
閱讀 2092·2021-11-02 14:48
閱讀 2768·2019-08-30 14:19
閱讀 2937·2019-08-30 13:19
閱讀 1305·2019-08-29 16:17
閱讀 3243·2019-08-26 14:05
閱讀 2997·2019-08-26 13:58
閱讀 3084·2019-08-23 18:10
閱讀 1112·2019-08-23 18:04