日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

java中的forkjoin框架的使用

瀏覽:20日期:2022-09-04 10:14:40

fork join框架是java 7中引入框架,這個框架的引入主要是為了提升并行計算的能力。

fork join主要有兩個步驟,第一就是fork,將一個大任務分成很多個小任務,第二就是join,將第一個任務的結果join起來,生成最后的結果。如果第一步中并沒有任何返回值,join將會等到所有的小任務都結束。

還記得之前的文章我們講到了thread pool的基本結構嗎?

ExecutorService - ForkJoinPool 用來調用任務執行。 workerThread - ForkJoinWorkerThread 工作線程,用來執行具體的任務。 task - ForkJoinTask 用來定義要執行的任務。

下面我們從這三個方面來詳細講解fork join框架。

ForkJoinPool

ForkJoinPool是一個ExecutorService的一個實現,它提供了對工作線程和線程池的一些便利管理方法。

public class ForkJoinPool extends AbstractExecutorService

一個work thread一次只能處理一個任務,但是ForkJoinPool并不會為每個任務都創建一個單獨的線程,它會使用一個特殊的數據結構double-ended queue來存儲任務。這樣的結構可以方便的進行工作竊取(work-stealing)。

什么是work-stealing呢?

默認情況下,work thread從分配給自己的那個隊列頭中取出任務。如果這個隊列是空的,那么這個work thread會從其他的任務隊列尾部取出任務來執行,或者從全局隊列中取出。這樣的設計可以充分利用work thread的性能,提升并發能力。

下面看下怎么創建一個ForkJoinPool。

最常見的方法就是使用ForkJoinPool.commonPool()來創建,commonPool()為所有的ForkJoinTask提供了一個公共默認的線程池。

ForkJoinPool forkJoinPool = ForkJoinPool.commonPool();

另外一種方式是使用構造函數:

ForkJoinPool forkJoinPool = new ForkJoinPool(2);

這里的參數是并行級別,2指的是線程池將會使用2個處理器核心。

ForkJoinWorkerThread

ForkJoinWorkerThread是使用在ForkJoinPool的工作線程。

public class ForkJoinWorkerThread extends Thread}

和一般的線程不一樣的是它定義了兩個變量:

final ForkJoinPool pool; // the pool this thread works in final ForkJoinPool.WorkQueue workQueue; // work-stealing mechanics

一個是該worker thread所屬的ForkJoinPool。 另外一個是支持 work-stealing機制的Queue。

再看一下它的run方法:

public void run() { if (workQueue.array == null) { // only run once Throwable exception = null; try { onStart(); pool.runWorker(workQueue); } catch (Throwable ex) { exception = ex; } finally { try { onTermination(exception); } catch (Throwable ex) { if (exception == null) exception = ex; } finally { pool.deregisterWorker(this, exception); } } } }

簡單點講就是從Queue中取出任務執行。

ForkJoinTask

ForkJoinTask是ForkJoinPool中運行的任務類型。通常我們會用到它的兩個子類:RecursiveAction和RecursiveTask<V>。

他們都定義了一個需要實現的compute()方法用來實現具體的業務邏輯。不同的是RecursiveAction只是用來執行任務,而RecursiveTask<V>可以有返回值。

既然兩個類都帶了Recursive,那么具體的實現邏輯也會跟遞歸有關,我們舉個使用RecursiveAction來打印字符串的例子:

public class CustomRecursiveAction extends RecursiveAction { private String workload = ''; private static final int THRESHOLD = 4; private static Logger logger = Logger.getAnonymousLogger(); public CustomRecursiveAction(String workload) { this.workload = workload; } @Override protected void compute() { if (workload.length() > THRESHOLD) { ForkJoinTask.invokeAll(createSubtasks()); } else { processing(workload); } } private List<CustomRecursiveAction> createSubtasks() { List<CustomRecursiveAction> subtasks = new ArrayList<>(); String partOne = workload.substring(0, workload.length() / 2); String partTwo = workload.substring(workload.length() / 2, workload.length()); subtasks.add(new CustomRecursiveAction(partOne)); subtasks.add(new CustomRecursiveAction(partTwo)); return subtasks; } private void processing(String work) { String result = work.toUpperCase(); logger.info('This result - (' + result + ') - was processed by ' + Thread.currentThread().getName()); }}

上面的例子使用了二分法來打印字符串。

我們再看一個RecursiveTask<V>的例子:

public class CustomRecursiveTask extends RecursiveTask<Integer> { private int[] arr; private static final int THRESHOLD = 20; public CustomRecursiveTask(int[] arr) { this.arr = arr; } @Override protected Integer compute() { if (arr.length > THRESHOLD) { return ForkJoinTask.invokeAll(createSubtasks()) .stream() .mapToInt(ForkJoinTask::join) .sum(); } else { return processing(arr); } } private Collection<CustomRecursiveTask> createSubtasks() { List<CustomRecursiveTask> dividedTasks = new ArrayList<>(); dividedTasks.add(new CustomRecursiveTask( Arrays.copyOfRange(arr, 0, arr.length / 2))); dividedTasks.add(new CustomRecursiveTask( Arrays.copyOfRange(arr, arr.length / 2, arr.length))); return dividedTasks; } private Integer processing(int[] arr) { return Arrays.stream(arr) .filter(a -> a > 10 && a < 27) .map(a -> a * 10) .sum(); }}

和上面的例子很像,不過這里我們需要有返回值。

在ForkJoinPool中提交Task

有了上面的兩個任務,我們就可以在ForkJoinPool中提交了:

int[] intArray= {12,12,13,14,15}; CustomRecursiveTask customRecursiveTask= new CustomRecursiveTask(intArray); int result = forkJoinPool.invoke(customRecursiveTask); System.out.println(result);

上面的例子中,我們使用invoke來提交,invoke將會等待任務的執行結果。

如果不使用invoke,我們也可以將其替換成fork()和join():

customRecursiveTask.fork(); int result2= customRecursiveTask.join(); System.out.println(result2);

fork() 是將任務提交給pool,但是并不觸發執行, join()將會真正的執行并且得到返回結果。

本文的例子可以參考https://github.com/ddean2009/learn-java-concurrency/tree/master/forkjoin

到此這篇關于java中的fork join框架的使用的文章就介紹到這了,更多相關java fork join框架內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品伦一区二区| 欧美va天堂在线| 国产精品日本欧美一区二区三区| 成人啊v在线| 成人福利av| 色婷婷精品视频| 欧美日中文字幕| 免费毛片在线不卡| 国产精品毛片在线| 亚洲精品一二| 91亚洲精品在看在线观看高清| 亚洲精品美女91| 日韩av电影一区| 麻豆国产一区| 亚洲天堂av影院| 国产一区二区三区亚洲| 91麻豆国产自产在线观看亚洲| av中文资源在线资源免费观看| 日韩毛片视频| 欧美福利专区| 亚洲欧美视频| 精品国产乱码久久久久久樱花| 亚洲综合色婷婷在线观看| 麻豆精品99| 欧美不卡高清| 中文字幕人成乱码在线观看| 亚洲欧美成人综合| 综合色就爱涩涩涩综合婷婷| 91嫩草精品| 国产欧美日韩精品高清二区综合区| 国产在线欧美| 蜜桃视频第一区免费观看| 91欧美极品| 91综合网人人| 欧美+日本+国产+在线a∨观看| 午夜亚洲精品| 欧美日本久久| 深夜视频一区二区| 国产日韩综合| 欧美专区一区| se01亚洲视频 | 香蕉成人av| 欧美a级一区| 日本91福利区| 日韩国产专区| 午夜在线一区二区| 国产精品天天看天天狠| 91欧美在线| 鲁大师成人一区二区三区| 欧美亚洲综合视频| 日韩精品看片| 日韩中出av| 成人一区而且| 鲁大师影院一区二区三区| 久久久久久网| 日欧美一区二区| 色在线视频观看| 视频一区视频二区中文| 国产精品啊v在线| 久久人人88| 欧美日一区二区在线观看| 中国字幕a在线看韩国电影| 9色国产精品| 精品在线网站观看| 亚洲免费在线| 水蜜桃久久夜色精品一区| 麻豆久久精品| 水蜜桃精品av一区二区| 亚洲日本在线观看视频| 美女福利一区二区三区| 蜜桃免费网站一区二区三区| 国内不卡的一区二区三区中文字幕 | 夜夜嗨一区二区| 美女尤物国产一区| 美女精品一区| 亚洲一级少妇| 国产探花在线精品| 亚洲专区欧美专区| 色综合五月天| 国产精品亚洲片在线播放| 亚洲欧洲一区| 国产91在线播放精品| 日韩在线麻豆| 香蕉精品久久| 国产成人久久精品一区二区三区| 尤物精品在线| 国模精品一区| 日韩精品五月天| 亚洲国产一区二区在线观看| 日韩88av| 麻豆精品少妇| 日本va欧美va精品发布| 亚洲深爱激情| 久久视频一区| 国产激情一区| 日韩欧美精品一区二区综合视频| 好看的亚洲午夜视频在线| 岛国av免费在线观看| 久久国产精品免费一区二区三区| 好看的av在线不卡观看| 日韩欧美在线中字| 国产精品密蕾丝视频下载| 日本亚洲最大的色成网站www | 日韩1区2区日韩1区2区| 国产精品美女久久久| 99精品美女| 在线看片福利| 国产一区二区三区亚洲| 麻豆精品蜜桃视频网站| 91精品丝袜国产高跟在线| 久久亚洲风情| 伊人久久大香线蕉av超碰演员| 999国产精品视频| 欧美成a人片免费观看久久五月天| 日韩av一区二区在线影视| 日韩欧美精品一区二区综合视频| 一区二区精彩视频| 免费观看久久久4p| 亚洲欧美网站| 国产亚洲高清视频| 影音先锋国产精品| 亚洲免费黄色| 好看的亚洲午夜视频在线| 久久国产亚洲| 亚洲二区精品| 亚洲国产一区二区在线观看| 好看的亚洲午夜视频在线| 蜜臀91精品国产高清在线观看| 国产传媒在线观看| 亚洲精品永久免费视频| 亚洲综合电影| 午夜精品久久久久久久久久蜜桃| 中文字幕在线高清| 最新中文字幕在线播放| 少妇精品导航| 国产综合亚洲精品一区二| 亚洲午夜黄色| 午夜日本精品| 玖玖精品视频| 亚洲精品字幕| 日韩视频1区| 88久久精品| 国产精品mv在线观看| 国产欧美三级| 国产女人18毛片水真多18精品| 久久gogo国模啪啪裸体| 老色鬼精品视频在线观看播放| 国产成人精品一区二区三区在线| 97人人精品| 神马午夜久久| 夜夜嗨网站十八久久| 中文在线日韩| 久久激情五月婷婷| 老色鬼精品视频在线观看播放| 日韩在线观看| 国产视频一区欧美| 青青国产91久久久久久| 国产+成+人+亚洲欧洲在线| 国产h片在线观看| 欧美成人综合| 日韩欧美另类中文字幕| 国产伊人久久| 午夜av一区| 日本少妇一区二区| 在线看片福利| 中文字幕免费一区二区| 久久中文精品| 亚洲精品a级片| 日韩精品导航| 成人影视亚洲图片在线| 亚洲欧美日韩视频二区| 国产精品三级| 91精品精品| 综合干狼人综合首页| 国产精品一区二区三区美女| 在线人成日本视频| 亚洲人成精品久久久| 精品视频一区二区三区在线观看 | 亚洲一区二区三区免费在线观看| 日本午夜精品一区二区三区电影| 国产精品久久久久久久久久10秀 | 国产伦精品一区二区三区视频| 精品久久福利| 另类亚洲自拍| 91免费精品| 日韩激情综合| 久久久精品久久久久久96| 日本在线不卡视频一二三区| 丝袜诱惑一区二区| 日韩一区二区三区精品视频第3页| 国产不卡人人| 日韩三区四区| 亚州av乱码久久精品蜜桃| 国产精品任我爽爆在线播放| 欧美jjzz| 91中文字幕精品永久在线| 日韩精品一区二区三区中文| 91亚洲国产成人久久精品| 亚洲精品婷婷| 久久视频精品|