国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java的Fork/Join任務(wù)

venmos / 3007人閱讀

摘要:方法返回對(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 RecursiveTask extends 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 default Stream parallelStream()的方法轉(zhuǎn)換成并行流進(jìn)行計(jì)算,此時(shí)效果與Fork/Join任務(wù)同效。

c .ForkJoinPool中的多種方法

public  ForkJoinTask 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

相關(guān)文章

  • Java7任務(wù)并行執(zhí)行神器:Fork&Join框架

    摘要:對(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è)小...

    Luosunce 評(píng)論0 收藏0
  • Fork/Join框架

    摘要:框架框架簡(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ù)...

    GitChat 評(píng)論0 收藏0
  • Java多線程進(jìn)階(四三)—— J.U.C之executors框架:Fork/Join框架(1) 原

    摘要:同時(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...

    cooxer 評(píng)論0 收藏0
  • Java 多線程(5):Fork/Join 型線程池與 Work-Stealing 算法

    摘要:時(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...

    IamDLY 評(píng)論0 收藏0
  • Java多線程進(jìn)階(四三)—— J.U.C之executors框架:Fork/Join框架(2)實(shí)現(xiàn)

    摘要:并不會(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) 原理,我們...

    FingerLiu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<