日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java forkjoin 简书_浅谈Java的Fork/Join并发框架

發(fā)布時(shí)間:2025/3/15 java 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java forkjoin 简书_浅谈Java的Fork/Join并发框架 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. Fork/Join是什么

Oracle的官方給出的定義是:Fork/Join框架是一個(gè)實(shí)現(xiàn)了ExecutorService接口的多線程處理器。它可以把一個(gè)大的任務(wù)劃分為若干個(gè)小的任務(wù)并發(fā)執(zhí)行,充分利用可用的資源,進(jìn)而提高應(yīng)用的執(zhí)行效率。

Fork/Join實(shí)現(xiàn)了ExecutorService,所以它的任務(wù)也需要放在線程池中執(zhí)行。它的不同在于它使用了工作竊取算法,空閑的線程可以從滿負(fù)荷的線程中竊取任務(wù)來幫忙執(zhí)行。(我個(gè)人理解的工作竊取大意就是:由于線程池中的每個(gè)線程都有一個(gè)隊(duì)列,而且線程間互不影響。那么線程每次都從自己的任務(wù)隊(duì)列的頭部獲取一個(gè)任務(wù)出來執(zhí)行。如果某個(gè)時(shí)候一個(gè)線程的任務(wù)隊(duì)列空了,而其余的線程任務(wù)隊(duì)列中還有任務(wù),那么這個(gè)線程就會(huì)從其他線程的任務(wù)隊(duì)列中取一個(gè)任務(wù)出來幫忙執(zhí)行。就像偷取了其他人的工作一樣)

Fork/Join框架的核心是繼承了AbstractExecutorService的ForkJoinPool類,它保證了工作竊取算法和ForkJoinTask的正常工作。

下面是引用Oracle官方定義的原文:

The fork/join framework is an implementation of the ExecutorService interface that helps you take advantage of multiple processors. It is designed for work that can be broken into smaller pieces recursively. The goal is to use all the available processing power to enhance the performance of your application.

As with any ExecutorService implementation, the fork/join framework distributes tasks to worker threads in a thread pool. The fork/join framework is distinct because it uses a work-stealing algorithm. Worker threads that run out of things to do can steal tasks from other threads that are still busy.

The center of the fork/join framework is the ForkJoinPool class, an extension of the AbstractExecutorService class. ForkJoinPool implements the core work-stealing algorithm and can execute ForkJoinTask processes.

2. Fork/Join的基本用法 (1)Fork/Join基類

上文已經(jīng)提到,Fork/Join就是要講一個(gè)大的任務(wù)分割成若干小的任務(wù),所以第一步當(dāng)然是要做任務(wù)的分割,大致方式如下:

if?(這個(gè)任務(wù)足夠小){???執(zhí)行要做的任務(wù)?}?else?{???將任務(wù)分割成兩小部分???執(zhí)行兩小部分并等待執(zhí)行結(jié)果?}

要實(shí)現(xiàn)FrokJoinTask我們需要一個(gè)繼承了RecursiveTask或RecursiveAction的基類,并根據(jù)自身業(yè)務(wù)情況將上面的代碼放入基類的coupute方法中。RecursiveTask和RecursiveAction都繼承了FrokJoinTask,它倆的區(qū)別就是RecursiveTask有返回值而RecursiveAction沒有。下面是我做的一個(gè)選出字符串列表中還有"a"的元素的Demo:

@Override?protected?List?compute()?{?????//?當(dāng)end與start之間的差小于閾值時(shí),開始進(jìn)行實(shí)際篩選?????if?(end?-?this.start??s.contains("a")).collect(Collectors.toList());?????}?else?{?????????//?如果當(dāng)end與start之間的差大于閾值時(shí)?????????//?將大任務(wù)分解成兩個(gè)小任務(wù)。?????????int?middle?=?(this.start?+?end)?/?2;?????????ForkJoinTest?left?=?new?ForkJoinTest(list,?this.start,?middle,?threshold);?????????ForkJoinTest?right?=?new?ForkJoinTest(list,?middle,?end,?threshold);?????????//?并行執(zhí)行兩個(gè)“小任務(wù)”?????????left.fork();?????????right.fork();?????????//?把兩個(gè)“小任務(wù)”的結(jié)果合并起來?????????List?join?=?left.join();?????????join.addAll(right.join());?????????return?join;?????}?}

(2)執(zhí)行類

做好了基類就可以開始調(diào)用了,調(diào)用時(shí)首先我們需要Fork/Join線程池ForkJoinPool,然后向線程池中提交一個(gè)ForkJoinTask并得到結(jié)果。ForkJoinPool的submit方法的入?yún)⑹且粋€(gè)ForkJoinTask,返回值也是一個(gè)ForkJoinTask,它提供一個(gè)get方法可以獲取到執(zhí)行結(jié)果。

代碼如下:

ForkJoinPool?pool?=?new?ForkJoinPool();?//?提交可分解的ForkJoinTask任務(wù)?ForkJoinTask>?future?=?pool.submit(forkJoinService);?System.out.println(future.get());?//?關(guān)閉線程池?pool.shutdown();

就這樣我們就完成了一個(gè)簡(jiǎn)單的Fork/Join的開發(fā)。

提示:Java8中java.util.Arrays的parallelSort()方法和java.util.streams包中封裝的方法也都用到了Fork/Join。(細(xì)心的讀者可能注意到我在Fork/Join中也有用到stream,所以其實(shí)這個(gè)Fork/Join是多余的,因?yàn)閟tream已經(jīng)實(shí)現(xiàn)了Fork/Join,不過這只是一個(gè)Demo展示,沒有任何實(shí)際用處也就無所謂了)

引用官方原文:

One such implementation, introduced in Java SE 8, is used by the java.util.Arrays class for its parallelSort() methods. These methods are similar to sort(), but leverage concurrency via the fork/join framework. Parallel sorting of large arrays is faster than sequential sorting when run on multiprocessor systems.

Another implementation of the fork/join framework is used by methods in the java.util.streams package, which is part of Project Lambda scheduled for the Java SE 8 release.

附完整代碼以便以后參考: 1. 定義抽象類(用于拓展,此例中沒有實(shí)際作用,可以不定義此類): import?java.util.concurrent.RecursiveTask;??/**??*?Description:?ForkJoin接口??*?Designer:?jack??*?Date:?2017/8/3??*?Version:?1.0.0??*/?public?abstract?class?ForkJoinService?extends?RecursiveTask{?????@Override?????protected?abstract?T?compute();?}

2. 定義基類 import?java.util.List;?import?java.util.stream.Collectors;??/**??*?Description:?ForkJoin基類??*?Designer:?jack??*?Date:?2017/8/3??*?Version:?1.0.0??*/?public?class?ForkJoinTest?extends?ForkJoinService>?{??????private?static?ForkJoinTest?forkJoinTest;?????private?int?threshold;??//閾值?????private?List?list;?//待拆分List??????private?ForkJoinTest(List?list,?int?threshold)?{?????????this.list?=?list;?????????this.threshold?=?threshold;?????}??????@Override?????protected?List?compute()?{?????????//?當(dāng)end與start之間的差小于閾值時(shí),開始進(jìn)行實(shí)際篩選?????????if?(list.size()??s.contains("a")).collect(Collectors.toList());?????????}?else?{?????????????//?如果當(dāng)end與start之間的差大于閾值時(shí),將大任務(wù)分解成兩個(gè)小任務(wù)。?????????????int?middle?=?list.size()?/?2;?????????????List?leftList?=?list.subList(0,?middle);?????????????List?rightList?=?list.subList(middle,?list.size());?????????????ForkJoinTest?left?=?new?ForkJoinTest(leftList,?threshold);?????????????ForkJoinTest?right?=?new?ForkJoinTest(rightList,?threshold);?????????????//?并行執(zhí)行兩個(gè)“小任務(wù)”?????????????left.fork();?????????????right.fork();?????????????//?把兩個(gè)“小任務(wù)”的結(jié)果合并起來?????????????List?join?=?left.join();?????????????join.addAll(right.join());?????????????return?join;?????????}?????}??????/**??????*?獲取ForkJoinTest實(shí)例??????*?@param?list??待處理List??????*?@param?threshold?閾值??????*?@return?ForkJoinTest例??????*/?????public?static?ForkJoinService>?getInstance(List?list,?int?threshold)?{?????????if?(forkJoinTest?==?null)?{?????????????synchronized?(ForkJoinTest.class)?{?????????????????if?(forkJoinTest?==?null)?{?????????????????????forkJoinTest?=?new?ForkJoinTest(list,?threshold);?????????????????}?????????????}?????????}?????????return?forkJoinTest;?????}?}? 3. 執(zhí)行類? import?java.util.ArrayList;?import?java.util.Arrays;?import?java.util.List;?import?java.util.concurrent.ExecutionException;?import?java.util.concurrent.ForkJoinPool;?import?java.util.concurrent.ForkJoinTask;??/**??*?Description:?Fork/Join執(zhí)行類??*?Designer:?jack??*?Date:?2017/8/3??*?Version:?1.0.0??*/?public?class?Test?{??????public?static?void?main(String?args[])?throws?ExecutionException,?InterruptedException?{??????????String[]?strings?=?{"a",?"ah",?"b",?"ba",?"ab",?"ac",?"sd",?"fd",?"ar",?"te",?"se",?"te",?????????????????"sdr",?"gdf",?"df",?"fg",?"gh",?"oa",?"ah",?"qwe",?"re",?"ty",?"ui"};?????????List?stringList?=?new?ArrayList<>(Arrays.asList(strings));??????????ForkJoinPool?pool?=?new?ForkJoinPool();?????????ForkJoinService>?forkJoinService?=?ForkJoinTest.getInstance(stringList,?20);?????????//?提交可分解的ForkJoinTask任務(wù)?????????ForkJoinTask>?future?=?pool.submit(forkJoinService);?????????System.out.println(future.get());?????????//?關(guān)閉線程池?????????pool.shutdown();??????}??}

===============================================================================

原文轉(zhuǎn)載自網(wǎng)絡(luò),IT學(xué)習(xí)交流群QQ543427910

總結(jié)

以上是生活随笔為你收集整理的java forkjoin 简书_浅谈Java的Fork/Join并发框架的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中文字幕素人 | 国产无遮挡免费观看视频网站 | 无码人妻一区二区三区精品视频 | 国产资源在线看 | 熟女毛毛多熟妇人妻aⅴ在线毛片 | 久久高清av| 黑人与亚洲人色ⅹvideos | 999精品国产 | 国产精品av一区 | 妺妺窝人体色www聚色窝仙踪 | 亚洲AV成人午夜无码精品久久 | 国产午夜精品无码 | 爱插网 | 国产伦精品一区二区三区四区免费 | 午夜网站视频 | 少妇又紧又色又爽又刺激视频 | 国产免费成人 | 黄色成人av在线 | 黄色一级视频免费观看 | 91大片在线观看 | 国产精品视频大全 | 小泽玛利亚一区二区三区 | 精品国产乱码久久久久久牛牛 | 国产在线视视频有精品 | 99国产精品白浆在线观看免费 | 亚洲大尺度av| 久久99精品久久久久 | 女生裸体无遮挡 | 久久久久久久久久久久电影 | 蜜美杏av| 国产精品区一区二 | 午夜看片福利 | 午夜久久久 | 亚洲少妇色 | 国产永久在线 | 91在线观看欧美日韩 | 午夜精品福利一区二区蜜股av | 欧美精品久久久久性色 | 亚洲av永久无码精品三区在线 | 69xx欧美 | 在线国产毛片 | 一区二区三区在线观看av | 日日摸夜夜添狠狠添久久精品成人 | 天天爱天天舔 | 亚洲乱码少妇 | 欧美成人三级伦在线观看 | 日韩中文字幕网址 | 久久93| 秋霞成人 | 青青草自拍视频 | 成人有色视频 | 波多野结衣精品在线 | 欧美精品99久久 | 亚洲国产精选 | 日韩av中文在线观看 | 国语对白少妇spa私密按摩 | 国产色吧| 强公把我次次高潮hd | 久久高清国产 | 天堂中文在线观看视频 | 亚洲 小说区 图片区 都市 | 国产主播第一页 | 欧美精品久久天天躁 | 第一页综合 | 成人性生生活性生交3 | 欧美激情国产在线 | 欧美日韩一区二区三区视频 | 国产av自拍一区 | 青青草视频在线观看 | 华丽的外出在线 | 一区视频在线播放 | 一区二区三区国产视频 | 成人在线激情视频 | 国产一伦一伦一伦 | 人人做人人爽人人爱 | 成年网站免费在线观看 | 97精品一区二区视频在线观看 | 日韩青青草 | 亚洲色图欧美在线 | 嫩草大剧院 | 欧美日韩电影一区二区三区 | 性欧美视频在线观看 | 成年人91视频 | 日韩欧美色图 | 国产亚洲av综合人人澡精品 | 超碰人人做 | 国产www性| 亚洲影视网 | 天堂va欧美ⅴa亚洲va一国产 | 蓝牛av| 日韩专区一区 | 在线性视频 | 欧美大片a| 操极品女神| 人妻av一区二区 | 尹人综合 | 大尺度做爰床戏呻吟舒畅 | 美女18毛片 | 国产精品无码白浆高潮 |