摘要:方法返回對象,如果任務被取消了則返回。如果任務沒有完成或者沒有拋出異常則返回。
一. Fork/Join
1 . 簡單介紹
a . Fork/Join為JKD1.7引入,適用于對大量數據進行拆分成多個小任務進行計算的框架,最后把所有小任務的結果匯總合并得到最終的結果
b . 相關類
public abstract class RecursiveTaskextends ForkJoinTask ; public abstract class RecursiveAction extends ForkJoinTask ;
c . 其中RecursiveTask在執行有返回值的任務時使用,RecursiveAction在執行沒有返回值的任務時使用
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{ //默認任務計算限制 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){ //若集合數量小于限制值則直接計算 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; } // 任務大于限制值,則一分為二: 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) { //獲取當前系統CPU核數 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; //等待結果返回 result=forkJoinPool.invoke(task); //使用Future 獲取結果 // 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 .在有大量計算任務時,此框架方法可進行并行計算效率高,以上示例,可以根據具體的業務需求更改屬性及相關方法用于匹配自己的業務邏輯
b .JDK1.8后由于加入Stream流的操作,集合框架可以使用Collection
c .ForkJoinPool中的多種方法
publicForkJoinTask submit(ForkJoinTask task);//等待獲取結果 public void execute(ForkJoinTask> task);//異步執行 public T invoke(ForkJoinTask task);//執行,獲取Future
d .ForkJoinTask在執行的時候可能會拋出異常,但是沒辦法在主線程里直接捕獲異常,所以ForkJoinTask提供了isCompletedAbnormally()方法來檢查任務是否已經拋出異常或已經被取消了,并且可以通過ForkJoinTask的getException方法獲取異常。getException方法返回Throwable對象,如果任務被取消了則返回CancellationException。如果任務沒有完成或者沒有拋出異常則返回null。
if(task.isCompletedAbnormally()) { System.out.println(task.getException()); }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67403.html
摘要:對于任務的分割,要求各個子任務之間相互獨立,能夠并行獨立地執行任務,互相之間不影響。是叉子分叉的意思,即將大任務分解成并行的小任務,是連接結合的意思,即將所有并行的小任務的執行結果匯總起來。使用方法會阻塞并等待子任務執行完并得到其結果。 Fork/Join是什么? Fork/Join框架是Java7提供的并行執行任務框架,思想是將大任務分解成小任務,然后小任務又可以繼續分解,然后每個小...
摘要:框架框架簡介框架是提供的一個用于并行執行任務的框架,是一個把大任務分割成若干個小任務,最終匯總每個小任務結果得到大任務結果的框架。框架實例需求計算的結果。 Fork/Join框架 1. Fork/Join框架簡介 Fork/Join框架是java7提供的一個用于并行執行任務的框架,是一個把大任務分割成若干個小任務,最終匯總每個小任務結果得到大任務結果的框架。Fork指的就是把一個大任務...
摘要:同時,它會通過的方法將自己注冊到線程池中。線程池中的每個工作線程都有一個自己的任務隊列,工作線程優先處理自身隊列中的任務或順序,由線程池構造時的參數決定,自身隊列為空時,以的順序隨機竊取其它隊列中的任務。 showImg(https://segmentfault.com/img/bVbizJb?w=1802&h=762); 本文首發于一世流云的專欄:https://segmentfau...
摘要:時,標準類庫添加了,作為對型線程池的實現。類圖用來專門定義型任務完成將大任務分割為小任務以及合并結果的工作。 JDK 1.7 時,標準類庫添加了 ForkJoinPool,作為對 Fork/Join 型線程池的實現。Fork 在英文中有 分叉 的意思,而 Join 有 合并 的意思。ForkJoinPool 的功能也是如此:Fork 將大任務分叉為多個小任務,然后讓小任務執行,Join...
摘要:并不會為每個任務都創建工作線程,而是根據實際情況構造線程池時的參數確定是喚醒已有空閑工作線程,還是新建工作線程。 showImg(https://segmentfault.com/img/bVbiYSP?w=1071&h=707); 本文首發于一世流云的專欄:https://segmentfault.com/blog... 一、引言 前一章——Fork/Join框架(1) 原理,我們...
閱讀 2082·2021-11-02 14:48
閱讀 2760·2019-08-30 14:19
閱讀 2929·2019-08-30 13:19
閱讀 1297·2019-08-29 16:17
閱讀 3230·2019-08-26 14:05
閱讀 2987·2019-08-26 13:58
閱讀 3075·2019-08-23 18:10
閱讀 1105·2019-08-23 18:04