Java并發(fā)系列6-Fork/Join框架

聲明:原創(chuàng)文章,轉(zhuǎn)載請注明出處。http://www.reibang.com/u/e02df63eaa87

一、介紹

1节视、Fork/Join框架是Java7提供了的一個用于并行執(zhí)行任務的框架, 是一個把大任務分割成若干個小任務假栓,最終匯總每個小任務結(jié)果后得到大任務結(jié)果的框架寻行。

Fork:把一個大任務切分為若干子任務并行的執(zhí)行。
Join:合并這些子任務的執(zhí)行結(jié)果但指,最后得到這個大任務的結(jié)果寡痰。

Fork/Join示意圖

上圖中,上部的Task依賴于下部的Task執(zhí)行棋凳,只有當各個子任務執(zhí)行完成后拦坠,才能得到Task0的返回結(jié)果。

2剩岳、原理
分割任務贞滨。需要有一個fork類來將主任務分割成子任務,存在嵌套分隔的情況拍棕。

執(zhí)行任務并合并結(jié)果晓铆。分割的子任務分別放在各自的雙端隊列中,之后啟動幾個線程分別從其所有的雙端隊列中獲取任務執(zhí)行绰播。子任務執(zhí)行完的結(jié)果都統(tǒng)一放在一個結(jié)果隊列中骄噪,啟動一個線程從此隊列中獲取并合并數(shù)據(jù)。

Fork/Join使用兩個類來完成以上兩件事情:

  • ForkJoinTask:使用ForkJoin框架蠢箩,必須首先創(chuàng)建一個ForkJoin任務链蕊。它提供在任務中執(zhí)行fork()和join()操作,通常情況下我們不需要直接繼承ForkJoinTask類谬泌,而只需要繼承它的子類滔韵,F(xiàn)ork/Join框架提供了以下兩個子類:
  • RecursiveAction:用于沒有返回結(jié)果的任務。
  • RecursiveTask :用于有返回結(jié)果的任務掌实。
  • ForkJoinPool :ForkJoinTask需要通過ForkJoinPool來執(zhí)行陪蜻,任務分割出的子任務會添加到當前工作線程所維護的雙端隊列中,進入隊列的頭部贱鼻。當一個工作線程的隊列里暫時沒有任務時宴卖,它會隨機從其他工作線程的隊列的尾部獲取一個任務滋将。

二、例子

通過一個例子症昏,簡單介紹fork/join框架的使用耕渴,計算任務是:計算1 + 2 + ... + 100
1、首先是繼承類齿兔,由于我們需要子任務返回結(jié)果,因此選擇帶有返回結(jié)果的RecursiveTask础米。
2分苇、繼承RecursiveTask類后,需要實現(xiàn)其父類的抽象方法compute()屁桑。
3医寿、任務分隔, 設(shè)定閾值為10蘑斧,如果超過該閾值靖秩,則進行分隔。

public class CountTask extends RecursiveTask<Integer> {

    private static final int THRESHOLD = 10; // 閾值
    private int start;
    private int end;

    public CountTask(int start, int end) {
        this.start = start;
        this.end = end;
    }

    @Override
    protected Integer compute() {
        boolean isNeedSplit = (end - start) > THRESHOLD;
        int sum = 0;

        if (!isNeedSplit) {
            for (int i = start; i <= end; ++i) {
                sum += i;
            }
            return sum;
        }

        // 分隔任務
        int mid = (start + end) >> 1;
        CountTask lowTask = new CountTask(start, mid);
        CountTask highTask = new CountTask(mid + 1, end);
        // 子任務執(zhí)行
        lowTask.fork();
        highTask.fork();
        // 獲取子任務計算結(jié)果
        return lowTask.join() + highTask.join();
    }

    public static void main(String[] args) throws Exception {
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        // 創(chuàng)建新任務
        CountTask task = new CountTask(1, 100);
        // 提交任務
        Future<Integer> ret = forkJoinPool.submit(task);
        // 輸出結(jié)果
        System.out.println(ret.get());
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末竖瘾,一起剝皮案震驚了整個濱河市沟突,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捕传,老刑警劉巖惠拭,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異庸论,居然都是意外死亡职辅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門聂示,熙熙樓的掌柜王于貴愁眉苦臉地迎上來域携,“玉大人,你說我怎么就攤上這事鱼喉⌒惚蓿” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵蒲凶,是天一觀的道長气筋。 經(jīng)常有香客問我,道長旋圆,這世上最難降的妖魔是什么宠默? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮灵巧,結(jié)果婚禮上搀矫,老公的妹妹穿的比我還像新娘抹沪。我一直安慰自己,他們只是感情好瓤球,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布融欧。 她就那樣靜靜地躺著,像睡著了一般卦羡。 火紅的嫁衣襯著肌膚如雪噪馏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天绿饵,我揣著相機與錄音欠肾,去河邊找鬼。 笑死拟赊,一個胖子當著我的面吹牛刺桃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吸祟,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瑟慈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了屋匕?” 一聲冷哼從身側(cè)響起葛碧,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎过吻,沒想到半個月后吹埠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡疮装,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年缘琅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片廓推。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡刷袍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出樊展,到底是詐尸還是另有隱情呻纹,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布专缠,位于F島的核電站雷酪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏涝婉。R本人自食惡果不足惜哥力,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吩跋,春花似錦寞射、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至梁丘,卻和暖如春侵浸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背氛谜。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工通惫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人混蔼。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像珊燎,于是被迫代替她去往敵國和親惭嚣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容