一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java中fork-join的原理解析

java中fork-join的原理解析

2021-09-07 12:14darmi-大張 Java教程

Fork/Join框架是Java7提供用于并行執行任務的框架,是一個把大任務分割成若干個小任務,今天通過本文給大家分享java中fork join原理,感興趣的朋友一起看看吧

ForkJoinTask就是ForkJoinPool里面的每一個任務。他主要有兩個子類:RecursiveActionRecursiveTask。然后通過fork()方法去分配任務執行任務,通過join()方法匯總任務結果,

java中fork-join的原理解析

這就是整個過程的運用。他有兩個子類,使用這兩個子類都可以實現我們的任務分配和計算。

(1)RecursiveAction 一個遞歸無結果的ForkJoinTask(沒有返回值)

(2)RecursiveTask 一個遞歸有結果的ForkJoinTask(有返回值)

ForkJoinPool:中含有一個workQueues隊列;

workQueues:由ForkJoinTask數組和workerThread和指向ForkJoinPool的引用;

ForkJoinTask數組負責存放程序提交給ForkJoinPool的任務,而workerThread數組負責執行這些任務,ForkJoinPool的引用是為了當ForkJoinTask數組中的任務處理完之后再次獲取任務交給workerThread進行處理。整個結構大致如下圖:

java中fork-join的原理解析

知識點擴展:Java并發Fork-Join框架原理解析

1、什么是Foirk/Join框架

Fork/Join框架是Java7提供用于并行執行任務的框架,是一個把大任務分割成若干個小任務,最終匯總每個小任務結果后得到大任務結果的框架。

2、什么是并行流與順序流2.1 什么是并行流?

并行流就是把一個內容分成多個數據塊,并用不同的線程分別處理每個數據塊的流。

2.2 工作竊取模式

某個線程從其他隊列里竊取任務來執行,

3、使用Fork/Join框架

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/**
 *  累加運算測試
 */
public class ForkJoinCalculate extends RecursiveTask<Long> {
 
    /**
     *
     */
    private static final long serialVersionUID = 7125244951292834932L;
     
    private long start;// 起始值
    private long end;// 結束值
    private static final long THRESHOLD = 10000L;// 臨界值
 
    @Override
    protected Long compute() {
        long length = end - start;
         
        if(length <= THRESHOLD) {
            long sum = 0L;
             
            for (long i = start; i <= end; i++) {
                sum += i;
            }
             
            return sum;
        }else {
            long middle = (start + end) / 2;// 中間值
             
            ForkJoinCalculate left = new ForkJoinCalculate(start, middle);// 0-50000000
            left.fork();// 拆分子任務,同時壓入線程隊列
            ForkJoinCalculate right = new ForkJoinCalculate(middle + 1, end);// 50000001-100000000
            right.fork();// 拆分子任務,同時壓入線程隊列
             
            return left.join() + right.join();// 匯總任務結果
        }
    }
     
    public ForkJoinCalculate() {
    }
 
    public ForkJoinCalculate(long start, long end) {
        this.start = start;
        this.end = end;
    }
}

4、Java8中的并行流和順序流

4.1順序流

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
     * Java8的順序流
     */
    @Test
    public void test3() {
        Instant start = Instant.now();// java8中新時間日期API
         
        LongStream.rangeClosed(0, 10000000000L)
                    .sequential()// 順序流
                    .reduce(0, Long::sum);
         
        Instant end = Instant.now();
         
        // 5780
        System.out.println("耗費時間為:" + Duration.between(start, end).toMillis());// java8中新時間日期API
    }

4.2步行流

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
     * Java8的并行流
     */
    @Test
    public void test4() {
        Instant start = Instant.now();// java8中新時間日期API
         
        LongStream.rangeClosed(0, 10000000000L)
                    .parallel()// 并行流
                    .reduce(0, Long::sum);
         
        Instant end = Instant.now();
         
        // 2392
        System.out.println("耗費時間為:" + Duration.between(start, end).toMillis());// java8中新時間日期API
    }

到此這篇關于java中fork-join的原理解析的文章就介紹到這了,更多相關java中fork-join原理內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/qq_28175019/article/details/115680638

延伸 · 閱讀

精彩推薦
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7472021-02-04
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
主站蜘蛛池模板: 91人人在线 | 国产精品视频免费一区二区三区 | 精品一区二区三区在线成人 | 欧美一区欧美二区 | 国自产在线精品免费 | 高h射尿| 99久久伊人精品波多野结衣 | 亚洲波霸| 九九99精品 | 黑人巨荃大战乌克兰美女 | 免费一级特黄特色大片∵黄 | 免费一区二区视频 | 国产一级毛片外aaaa | 精品无码一区在线观看 | 91制片厂 果冻传媒 天美传媒 | 国产成人精品曰本亚洲77美色 | 天码毛片一区二区三区入口 | 男人天堂日韩 | 精品手机在线视频 | 日韩高清成人毛片不卡 | 欧美se图 | 亚洲福利天堂网福利在线观看 | 亚洲 欧美 国产 综合 在线 | aaa毛片手机在线现看 | 甜蜜调教 | 三级视频中文字幕 | 亚洲国产精品一区二区三区久久 | 人人擦| tube日本高清老少配 | 美女脱一光二净的视频 | 国产精品日韩在线观看 | 色噜噜狠狠狠综合曰曰曰88av | 日日操综合 | 精品一区视频 | 好爽好深好猛好舒服视频上 | 国产麻豆流白浆在线观看 | 星星动漫无删减在线观看 | yy111111影院理论大片 | 好男人天堂网 | 91影视永久福利免费观看 | 国产福利在线免费观看 |