使用Java 7.0的 Fork/Join框架進行併發程式設計
Concurrent programming with Fork/Join framework in Java 7.0
fork/join框架主要是利用多核CPU併發,而之前介紹的Disruptor主要針對單核併發。一般單核情況下,因為運算邏輯的順序性,無法挖掘CPU潛力,CPU利用率比較低,如文中單核圖:
執行fork/join工作類,將原來需要2百萬的整數任務分成兩個一百萬分別產生:
交由專門的ForkJoinExecutor 執行,ForkJoinExecutor 和普通Executor 框架,ForkJoinExecutor使用了work-stealing 演算法,輔助執行緒可以從其他還在忙著的執行緒竊取任務。
總結:Fork/Join框架是專門對付那些邏輯上強順序性強一致性的運算場景,在一些無強一致性場合,我們可以透過簡單的多執行緒(Disruptor)就可以解決,比如你去買A,看到A排隊很長,那麼你可以改變自己的主意,先去買B。而如果你不想改變主意,執意排隊A,那麼Fork/Join框架無疑是個利器,能夠將A隊強行分割成幾個小分隊,你變成“城管”了。
fork/join框架主要是利用多核CPU併發,而之前介紹的Disruptor主要針對單核併發。一般單核情況下,因為運算邏輯的順序性,無法挖掘CPU潛力,CPU利用率比較低,如文中單核圖:
而使用了fork/join框架+多核CPU,CPU利用率就上來了:
其實這篇文章沒有回答一個問題,如何在單核情況下提高CPU利用率,我認為使用Disruptor。
fork/join基於divide-and-conquer演算法,適合將一個大任務劃分為多個小任務,讓多個CPU執行,然後再合併結果,如下圖。如果你不要合併結果,可選方案就很多。
fork/join類似MapReduce演算法,兩者區別是:Fork/Join 只有在必要時如任務非常大的情況下才分割成一個個小任務,而 MapReduce總是在開始執行第一步進行分割。看來,Fork/Join更適合一個JVM內執行緒級別,而MapReduce適合分散式系統。
文章案例,需要切割的大任務:產生大量整數。
package mrbool.com; import java.util.Random; // This class defines a list which will contain large number of integers. public class LargeInteger { private final int[] list = new int[2000000]; public largeInteger() { Random generator = new Random(19580427); for (int i = 0; i < list.length; i++) { list[i] = generator.nextInt(500000); } } public int[] getList() { return list; } } <p class="indent"> |
執行fork/join工作類,將原來需要2百萬的整數任務分成兩個一百萬分別產生:
package mrbool.com; import java.util.Arrays; import jsr166y.forkjoin.RecursiveAction; public class SplitTask extends RecursiveAction { private int[] list; public long result; public SplitTask(int[] array) { this.list = array; } @Override protected void compute() { if (list.length == 1) { result = list[0]; } else { int midpoint = list.length / 2; int[] l1 = Arrays.copyOfRange(list, 0, midpoint); int[] l2 = Arrays.copyOfRange(list, midpoint, list.length); SplitTask s1 = new SplitTask(l1); SplitTask s2 = new SplitTask(l2); forkJoin(s1, s2);//關鍵 result = s1.result + s2.result;//合併結果 } } } <p class="indent"> |
交由專門的ForkJoinExecutor 執行,ForkJoinExecutor 和普通Executor 框架,ForkJoinExecutor使用了work-stealing 演算法,輔助執行緒可以從其他還在忙著的執行緒竊取任務。
import jsr166y.forkjoin.ForkJoinExecutor; import jsr166y.forkjoin.ForkJoinPool; import javablog.levent.com.SplitTask; public class TestForkJoin { public static void main(String[] args) { LargeInteger test = new LargeInteger(); // Check the number of available processors int nThreads = Runtime.getRuntime().availableProcessors(); System.out.println(nThreads); SplitTask mfj = new SplitTask(test.getList()); ForkJoinExecutor pool = new ForkJoinPool(nThreads); pool.invoke(mfj); long result = mfj.getResult(); System.out.println("Done. Result: " + result); } } <p class="indent"> |
總結:Fork/Join框架是專門對付那些邏輯上強順序性強一致性的運算場景,在一些無強一致性場合,我們可以透過簡單的多執行緒(Disruptor)就可以解決,比如你去買A,看到A排隊很長,那麼你可以改變自己的主意,先去買B。而如果你不想改變主意,執意排隊A,那麼Fork/Join框架無疑是個利器,能夠將A隊強行分割成幾個小分隊,你變成“城管”了。
相關文章
- Java併發 -- Fork/Join框架Java框架
- Java併發程式設計(07):Fork/Join框架機制詳解Java程式設計框架
- Fork Join 併發任務執行框架框架
- Java併發6:阻塞佇列,Fork/Join框架Java佇列框架
- Java Fork/Join 框架Java框架
- 多執行緒高併發程式設計(8) -- Fork/Join原始碼分析執行緒程式設計原始碼
- ☕【Java技術指南】「併發程式設計專題」Fork/Join框架基本使用和原理探究(原理及原始碼篇)Java程式設計框架原始碼
- Java併發基礎-Fork、Join方式的平行計算研究分析Java
- Fork/Join框架框架
- Fork/Join 框架框架
- Java7提供的並行執行任務框架:Fork、Join框架Java並行框架
- 併發程式設計 join原理程式設計
- Java 併發程式設計 Executor 框架Java程式設計框架
- java併發程式設計:執行緒池的使用Java程式設計執行緒
- 《java併發程式設計的藝術》併發容器和框架Java程式設計框架
- JUC之Fork/Join框架框架
- java多執行緒8:阻塞佇列與Fork/Join框架Java執行緒佇列框架
- 《java併發程式設計的藝術》Executor框架Java程式設計框架
- Java併發程式設計:Java執行緒Java程式設計執行緒
- java併發程式設計:Thread類的使用Java程式設計thread
- 【架構】Java併發程式設計——執行緒池的使用架構Java程式設計執行緒
- java併發程式設計系列:java併發程式設計背景知識Java程式設計
- Java併發程式設計筆記6:執行緒池的使用Java程式設計筆記執行緒
- Java併發程式設計:執行緒和鎖的使用與解析Java程式設計執行緒
- java併發程式設計——執行緒池Java程式設計執行緒
- java併發程式設計——執行緒同步Java程式設計執行緒
- java 併發程式設計Java程式設計
- Java併發程式設計Java程式設計
- Java併發程式設計---java規範與模式下的併發程式設計1.1Java程式設計模式
- 快速使用 vscode 進行 Java 程式設計VSCodeJava程式設計
- Java核心技術學習筆記——進階——第五章 Java多執行緒和併發程式設計——5.5 Java併發框架ExecutorJava筆記執行緒程式設計框架
- Java併發程式設計:Java執行緒池核心ThreadPoolExecutor的使用和原理分析Java程式設計執行緒thread
- 併發程式設計進階程式設計
- python教程:使用 async 和 await 協程進行併發程式設計PythonAI程式設計
- Java併發程式設計 - 第十一章 Java併發程式設計實踐Java程式設計
- java併發程式設計 | 執行緒詳解Java程式設計執行緒
- Java併發程式設計-執行緒基礎Java程式設計執行緒
- Java併發程式設計:執行緒池ThreadPoolExecutorJava程式設計執行緒thread
- Java併發程式設計—ThreadLocalJava程式設計thread