talosのプログラミング教室

Java Gold合格への道 ~並行処理・Fork/Joinフレームワーク~

スポンサーリンク

こんにちは。たろすです。

今回は並行処理におけるFork/Joinフレームワークについて説明します。

Fork/Joinフレームワークとは

Forkは分割、Joinは結合を意味しています。

つまり、Fork/Joinフレームワークはタスクを分割して実行し、結果を結合するフレームワークです。

以下のように使用します。

public class Task extends RecursiveTask<String> {

	@Override
	protected String compute() {
		return "Task ended";
	}
}
public class Main {
	public static void main(String[] args) {

		try {
			ForkJoinPool executor = new ForkJoinPool();
			ForkJoinTask<String> result = executor.submit(new Task());
			System.out.println(result.get());
		} catch (InterruptedException | ExecutionException e) {
			e.printStackTrace();
		}
	}
}
Task ended

タスクの実装にはRecursiveActionクラスまたはRecursiveTask<V>クラスを継承します。

戻り値がない場合はRecursiveActionクラス、ある場合はRecursiveTask<V>クラスを継承します。

computeメソッドでタスクの処理を実装します。

タスク実行にはexecuteメソッド、invokeメソッド、submitメソッドがあり、以下のように使い分けます。

void execute(ForkJoinTask<?> task):非同期かつ処理結果なし
<T> T invoke(ForkJoinTask<T> task):同期かつ処理結果あり
<T> ForkJoinTask<T> submit(ForkJoinTask<T> task):非同期かつ処理結果あり

上記のコードで使用しているsubmitメソッドは戻り値がForkJoinTaskオブジェクトであり、getメソッドによってcomputeメソッドの戻り値を取り出せます。

おわりに

今回は並行処理におけるFork/Joinフレームワークについて説明しました。