免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

什么是ForkJoin?看這一篇就能掌握!

在JDK中,提供了這樣一種功能:它能夠?qū)?fù)雜的邏輯拆分成一個(gè)個(gè)簡(jiǎn)單的邏輯來并行執(zhí)行,待每個(gè)并行執(zhí)行的邏輯執(zhí)行完成后,再將各個(gè)結(jié)果進(jìn)行匯總,得出最終的結(jié)果數(shù)據(jù) 。有點(diǎn)像Hadoop中的MapReduce 。
ForkJoin是由JDK1.7之后提供的多線程并發(fā)處理框架 。ForkJoin框架的基本思想是分而治之 。什么是分而治之?分而治之就是將一個(gè)復(fù)雜的計(jì)算,按照設(shè)定的閾值分解成多個(gè)計(jì)算,然后將各個(gè)計(jì)算結(jié)果進(jìn)行匯總 。相應(yīng)的,F(xiàn)orkJoin將復(fù)雜的計(jì)算當(dāng)做一個(gè)任務(wù),而分解的多個(gè)計(jì)算則是當(dāng)做一個(gè)個(gè)子任務(wù)來并行執(zhí)行 。
Java并發(fā)編程的發(fā)展對(duì)于Java語言來說,生來就支持多線程并發(fā)編程,在并發(fā)編程領(lǐng)域也是在不斷發(fā)展的 。Java在其發(fā)展過程中對(duì)并發(fā)編程的支持越來越完善也正好印證了這一點(diǎn) 。

  • Java 1 支持thread,synchronized 。
  • Java 5 引入了 thread pools,blocking queues, concurrent collections,locks, condition queues 。
  • Java 7 加入了fork-join庫(kù) 。
  • Java 8 加入了 parallel streams 。
并發(fā)與并行并發(fā)和并行在本質(zhì)上還是有所區(qū)別的 。
并發(fā)并發(fā)指的是在同一時(shí)刻,只有一個(gè)線程能夠獲取到CPU執(zhí)行任務(wù),而多個(gè)線程被快速的輪換執(zhí)行,這就使得在宏觀上具有多個(gè)線程同時(shí)執(zhí)行的效果,并發(fā)不是真正的同時(shí)執(zhí)行,并發(fā)可以使用下圖表示 。
什么是ForkJoin?看這一篇就能掌握!

文章插圖
并行并行指的是無論何時(shí),多個(gè)線程都是在多個(gè)CPU核心上同時(shí)執(zhí)行的,是真正的同時(shí)執(zhí)行 。
什么是ForkJoin?看這一篇就能掌握!

文章插圖
分治法基本思想把一個(gè)規(guī)模大的問題劃分為規(guī)模較小的子問題,然后分而治之,最后合并子問題的解得到原問題的解 。
步驟①分割原問題;
②求解子問題;
③合并子問題的解為原問題的解 。
我們可以使用如下偽代碼來表示這個(gè)步驟 。
if(任務(wù)很?。﹞ 直接計(jì)算得到結(jié)果}else{ 分拆成N個(gè)子任務(wù) 調(diào)用子任務(wù)的fork()進(jìn)行計(jì)算 調(diào)用子任務(wù)的join()合并計(jì)算結(jié)果}在分治法中,子問題一般是相互獨(dú)立的,因此,經(jīng)常通過遞歸調(diào)用算法來求解子問題 。
典型應(yīng)用
  • 二分搜索
  • 大整數(shù)乘法
  • Strassen矩陣乘法
  • 棋盤覆蓋
  • 合并排序
  • 快速排序
  • 線性時(shí)間選擇
  • 漢諾塔
ForkJoin并行處理框架ForkJoin框架概述Java 1.7 引入了一種新的并發(fā)框架—— Fork/Join Framework,主要用于實(shí)現(xiàn)“分而治之”的算法,特別是分治之后遞歸調(diào)用的函數(shù) 。
ForkJoin框架的本質(zhì)是一個(gè)用于并行執(zhí)行任務(wù)的框架,能夠把一個(gè)大任務(wù)分割成若干個(gè)小任務(wù),最終匯總每個(gè)小任務(wù)結(jié)果后得到大任務(wù)的計(jì)算結(jié)果 。在Java中,F(xiàn)orkJoin框架與ThreadPool共存,并不是要替換ThreadPool
其實(shí),在Java 8中引入的并行流計(jì)算,內(nèi)部就是采用的ForkJoinPool來實(shí)現(xiàn)的 。例如,下面使用并行流實(shí)現(xiàn)打印數(shù)組元組的程序 。
public class SumArray { public static void main(String[] args){ List<Integer> numberList = Arrays.asList(1,2,3,4,5,6,7,8,9); numberList.parallelStream().forEach(System.out::println); }}這段代碼的背后就使用到了ForkJoinPool 。
說到這里,可能有讀者會(huì)問:可以使用線程池的ThreadPoolExecutor來實(shí)現(xiàn)?。繛槭裁匆褂肍orkJoinPool?。縁orkJoinPool是個(gè)什么鬼?。?! 接下來,我們就來回答這個(gè)問題 。
ForkJoin框架原理ForkJoin框架是從jdk1.7中引入的新特性,它同ThreadPoolExecutor一樣,也實(shí)現(xiàn)了Executor和ExecutorService接口 。它使用了一個(gè)無限隊(duì)列來保存需要執(zhí)行的任務(wù),而線程的數(shù)量則是通過構(gòu)造函數(shù)傳入,如果沒有向構(gòu)造函數(shù)中傳入指定的線程數(shù)量,那么當(dāng)前計(jì)算機(jī)可用的CPU數(shù)量會(huì)被設(shè)置為線程數(shù)量作為默認(rèn)值 。

經(jīng)驗(yàn)總結(jié)擴(kuò)展閱讀