成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Fork/Join框架

GitChat / 770人閱讀

摘要:框架框架簡(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ù)分割成若干子任務(wù)并行的執(zhí)行,Join就是合并這些子任務(wù)的執(zhí)行結(jié)果,最后得到這個(gè)大任務(wù)的結(jié)果。

比如計(jì)算1+2+3+4+5+……+10000,可以分割成10個(gè)子任務(wù),每個(gè)子任務(wù)負(fù)責(zé)分別對(duì)1000個(gè)數(shù)進(jìn)行求和,最終匯總這10個(gè)子任務(wù)的結(jié)果。

2. Fork/Join框架使用說明

使用Fork/Join框架我們需要兩個(gè)類:

ForkJoinTask:Fork/Join任務(wù),提供fork()和Join()方法,通常情況下繼承它的兩個(gè)子類:

RecursiveAction:返回沒有結(jié)果的任務(wù)。

RecursiveTask:返回有結(jié)果的任務(wù)。

ForkJoinPool:ForkJoinTask需要通過ForkJoinPool來執(zhí)行。

從ForkJoinTask的兩個(gè)子類的名字中就可以看到,這是一種采用遞歸方式實(shí)現(xiàn)的任務(wù)分割,任務(wù)分割的子任務(wù)會(huì)添加到當(dāng)前工作線程所維護(hù)的雙端隊(duì)列中,進(jìn)入隊(duì)列的頭部,當(dāng)一個(gè)工作線程的隊(duì)列里面暫時(shí)沒有任務(wù)時(shí),它會(huì)隨機(jī)從其他工作線程隊(duì)列的尾部獲取一個(gè)任務(wù)去執(zhí)行。

3. Fork/Join框架實(shí)例 3.1 需求:

計(jì)算1 + 2 + 3 +……+10 的結(jié)果。

3.2 需求分析設(shè)計(jì):

使用Fork/Join框架首先要考慮的就是如何分割任務(wù),和分割任務(wù)的粒度,這里我們考慮每個(gè)子任務(wù)最多執(zhí)行兩個(gè)數(shù)相加,那我們分割的閾值就是2,F(xiàn)ork/Join框架會(huì)把這個(gè)任務(wù)fork成5個(gè)子任務(wù),然后再join5個(gè)子任務(wù)的結(jié)果。因?yàn)槭怯薪Y(jié)果的任務(wù),所以必須繼承RecursiveTask。

3.3 代碼實(shí)例
package com.wangjun.thread;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;
import java.util.concurrent.RecursiveTask;

public class ForkJoinTaskTest extends RecursiveTask{
    
    private static final int THRESHOLD = 2;  // 閾值
    private int start;
    private int end;
    
    public ForkJoinTaskTest(int start, int end) {
        this.start = start;
        this.end = end;
    }
    
    @Override
    protected Integer compute() {
        int sum = 0;
         if(end - start < THRESHOLD) {
             System.out.println(Thread.currentThread().getName() + ":" + start + "-" + end);
             for(int i = start; i <= end; i++) {
                 sum += i;
             }
         }else {
             // 任務(wù)大于閾值,拆分子任務(wù)
             int middle = start + (end - start)/2;
             ForkJoinTaskTest task1 = new ForkJoinTaskTest(start, middle);
             ForkJoinTaskTest task2 = new ForkJoinTaskTest(middle + 1, end);
             // 執(zhí)行子任務(wù)
             task1.fork();
             task2.fork();
             // 等待子任務(wù)執(zhí)行完成,并得到其結(jié)果
             int result1 = task1.join();
             int result2 = task2.join();
             // 合并子任務(wù)
             sum = result1 + result2;
         }
        return sum;
    }
    
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        int start = 1;
        int end = 10;
        ForkJoinTaskTest task = new ForkJoinTaskTest(start, end);
        // 用來執(zhí)行ForkJoinTask
        ForkJoinPool pool = new ForkJoinPool();
        // 執(zhí)行任務(wù)
        Future result = pool.submit(task);
        System.out.println("最后的結(jié)果為:" + result.get());
    }

}

運(yùn)行結(jié)果:

ForkJoinPool-1-worker-2:3-3
ForkJoinPool-1-worker-0:4-5
ForkJoinPool-1-worker-3:6-7
ForkJoinPool-1-worker-1:1-2
ForkJoinPool-1-worker-3:8-8
ForkJoinPool-1-worker-0:9-10
最后的結(jié)果為:55

可以看到ForkJoinTask與一般的任務(wù)在于它需要實(shí)現(xiàn)compute()方法,在這個(gè)方法里面首先需要判斷是否需要分割子任務(wù),如果需要分割,每個(gè)子任務(wù)再調(diào)用fork方法時(shí),就會(huì)進(jìn)入compute()方法,如果不需要分割,則執(zhí)行當(dāng)前任務(wù)并返回結(jié)果,使用join方法會(huì)等待子任務(wù)結(jié)果的返回??梢钥吹竭@是一種遞歸的實(shí)現(xiàn)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69619.html

相關(guān)文章

  • Fork/Join框架簡(jiǎn)介

    摘要:第二步執(zhí)行任務(wù)并合并結(jié)果。使用兩個(gè)類來完成以上兩件事情我們要使用框架,必須首先創(chuàng)建一個(gè)任務(wù)。用于有返回結(jié)果的任務(wù)。如果任務(wù)順利執(zhí)行完成了,則設(shè)置任務(wù)狀態(tài)為,如果出現(xiàn)異常,則紀(jì)錄異常,并將任務(wù)狀態(tài)設(shè)置為。 1. 什么是Fork/Join框架 Fork/Join框架是Java7提供了的一個(gè)用于并行執(zhí)行任務(wù)的框架, 是一個(gè)把大任務(wù)分割成若干個(gè)小任務(wù),最終匯總每個(gè)小任務(wù)結(jié)果后得到大任務(wù)結(jié)果的...

    W_BinaryTree 評(píng)論0 收藏0
  • 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
  • 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
  • Fork-Join框架

    摘要:為了減少竊取線程和別竊取線程之間的競(jìng)爭(zhēng)我們通常使用雙端隊(duì)列。被竊取線程永遠(yuǎn)從雙端隊(duì)列的頭部獲取任務(wù),竊取線程永遠(yuǎn)從雙端隊(duì)列的尾部獲取內(nèi)容。優(yōu)點(diǎn)就是充分利用線程進(jìn)行并行計(jì)算,減少線程間的競(jìng)爭(zhēng)。使用操作的線程不能執(zhí)行操作。 Fork-Join框架 Fork和Join是java 1.7提供的用于定型執(zhí)行的框架,將大任務(wù)切分成若干個(gè)小任務(wù)執(zhí)行,小任務(wù)執(zhí)行結(jié)果匯總成大任務(wù)的框架。從字面上理解就是...

    ?xiaoxiao, 評(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元查看
<