第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

ForkJoin 并發(fā)框架介紹

1. 前言

本節(jié)帶領(lǐng)大家認識第二個并發(fā)框架之 ForkJoin。

本節(jié)先介紹 ForkJoin 并發(fā)框架的整個體系結(jié)構(gòu),接著介紹各部分中的核心接口和實現(xiàn)類,下一節(jié)中使用 ForkJoin 并發(fā)框架實現(xiàn)一個綜合例子,讓大家從整體概念、接口實現(xiàn)、應(yīng)用有一個較全面的了解。

下面我們正式開始介紹吧。

2. 整體結(jié)構(gòu)介紹

從 JDK 1.7 開始,java 提供了一套大任務(wù)分解成小任務(wù)并行執(zhí)行的框架 ForkJoin ,并且在 JDK 1.8 中進一步做了優(yōu)化。

相比上一節(jié)介紹的 Executor 并發(fā)框架而言,F(xiàn)orkJoin 框架更傾向于任務(wù)拆分并行執(zhí)行的場合,而 Executor 框架更適合于更一般的任務(wù)彼此之間無內(nèi)在關(guān)系的場合。

ForkJoin 框架的基本思想是將一個大任務(wù)拆分成多個處理邏輯相同的子任務(wù),最后將這些子任務(wù)的結(jié)果再匯總起來,從而得到大任務(wù)的結(jié)果。即在任務(wù)處理時,先進行任務(wù)切分,然后進行切分后的各子任務(wù)的計算,最后做結(jié)果合并。擔(dān)任子任務(wù)還可以繼續(xù)進行切分,這需要根據(jù)實際情況而定。

整體結(jié)構(gòu)已經(jīng)了解了,接著我們繼續(xù)了解各部分的核心接口和實現(xiàn)類。

3. 核心接口和實現(xiàn)類

整個 ForkJoin 框架的核心接口和實現(xiàn)類很簡潔,羅列如下:

  1. 線程池 ForkJoinPool,代表執(zhí)行任務(wù)的線程池。
  2. 執(zhí)行線程 ForkJoinWorkerThread,代表 ForkJoinPool 線程池中的一個執(zhí)行任務(wù)的線程。
  3. 任務(wù) ForkJoinTask ,代表運行在 ForkJoinPool 中的任務(wù)。

ForkJoin 框架核心接口的使用邏輯如下圖:
圖片描述
下面,我們繼續(xù)深入了解各接口和實現(xiàn)類的基本知識。

3.1. ForkJoinPool

ForkJoinPool 代表了此任務(wù)的執(zhí)行器,當(dāng)采用 ForkJoin 框架執(zhí)行我們的任務(wù)時,首先需要創(chuàng)建一個 ForkJoinPool 對象,所有后繼執(zhí)行的過程控制都交給此對象完成。代碼舉例:

// 構(gòu)建任務(wù)執(zhí)行器
ForkJoinPool pool = new ForkJoinPool();
// 提交待執(zhí)行的任務(wù)
ForkJoinTask<T> result = pool.submit(ForkJoinTask類型的對象);
// 開始任務(wù)執(zhí)行并獲取執(zhí)行結(jié)果
result.invoke();

3.2. ForkJoinWorkerThread

ForkJoinWorkerThread 是 ForkJoin 框架中用于執(zhí)行任務(wù)的線程實現(xiàn)。一般情況下我們無需顯式地使用此類,由 ForkJoinPool 類內(nèi)部自行創(chuàng)建并維護。

3.3. ForkJoinTask

ForkJoinTask 是一個抽象類,定義了任務(wù)的主要操作接口。

  1. fork ():在當(dāng)前線程運行的線程池中再創(chuàng)建提交一個子任務(wù)。
  2. join ():當(dāng)任務(wù)完成的時候返回計算結(jié)果。
  3. invoke ():開始執(zhí)行任務(wù),如果必要等待計算完成。

共有兩個子類:

  1. RecursiveAction:提供了無需關(guān)心任務(wù)執(zhí)行結(jié)果場合下的默認實現(xiàn)
  2. RecursiveTask:提供了最終需獲取任務(wù)執(zhí)行結(jié)果的場合下的默認實現(xiàn)

一般我們只需要根據(jù)實際情況,選擇繼承上面的兩個子類之一,然后實現(xiàn)自己的邏輯就可以了。代碼舉例:

class myTask extends RecursiveTask<Integer> {
	@Override
	protected Integer compute() {
		// 執(zhí)行邏輯,可根據(jù)情況直接計算返回,也可根據(jù)任務(wù)大小確定是否繼續(xù)拆分子任務(wù)
		SumTask left = new myTask(子任務(wù)待處理的數(shù)據(jù)范圍);
		SumTask right = new SumTask(子任務(wù)待處理的數(shù)據(jù)范圍);
		left.fork();
		right.fork();
		return left.join() + right.join();
	}
}

4. 小結(jié)

本節(jié)帶領(lǐng)大家對 ForkJoin 框架做整體認識,熟悉其最基本骨架內(nèi)容,先做到有整體的概念。具體 ForkJoin 框架如何使用呢,我們在下一節(jié)講述。希望大家在學(xué)習(xí)過程中,多思考勤練習(xí),早日掌握之。