JavaSE Fork Join
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
] [
Trackback(0)
]
開始行:
-Java 7 から
-タスクを並列に処理するためのフレームワーク
-基本的に再帰処理でタスクを分割する (擬似コード)
doSomething (List<task> tasks) {
if (tasks は小さい) {
task を処理する
}
task1 = tasks.分割(前半);
task2 = tasks.分割(後半);
task1.fork(); // 別スレッドで実行スケジュール
result2 = task2.compute(); // 同じスレッドで実行
result1 = task1.join(); // 実行終了待ち
// 前半部の処理結果と後半部の処理結果をマージする
return merge(result1, result2);
}
-サンプル (テイラー展開でπを求める)
#code(java){{{
package com.mycompany.sandbox;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
public class ForkJoinExam {
public static void main(String[] args) {
ForkJoinPool forkjoin = new ForkJoinPool();
System.out.println(forkjoin.invoke(new TaylorPi()...
}
}
class TaylorPi extends RecursiveTask<Double> {
private List<Long> data;
public TaylorPi() {
data = new ArrayList<>();
for (long l = 0L; l < 10_000_000L; l++) {
data.add(l);
}
}
public TaylorPi(List<Long> data) {
this.data = data;
}
@Override
protected Double compute() {
if (data.size() == 1) {
// データが短ければ自分で処理する
long l = data.get(0);
return 4.0 / (double)(((l & 1) == 0 ? 1L : -1...
}
// データを分割して、並列実行する
int i = data.size() / 2;
// 前半部分は別スレッドで実行
TaylorPi task1 = new TaylorPi(data.subList(0, i));
task1.fork();
// 後半部分は逐次実行し、前半部分の終了を待つ
TaylorPi task2 = new TaylorPi(data.subList(i, dat...
return task2.compute() + task1.join();
}
}
}}}
3.1415925535897915
テイラー展開ならこれくらいが限界かな。あと、これくらいな...
#br
|Double を返すタスク |RecursiveTask<Double>|
|処理結果を返さないタスク|RecursiveAction|
#br
|同期呼び出し |Double|ForkJoinPool#invoke(...
|非同期呼び出し |Future<Double>|ForkJoinPool...
|非同期呼び出し(突き放し実行)|void|ForkJoinPool#execute()|
----
[[Java#JavaSE]]
終了行:
-Java 7 から
-タスクを並列に処理するためのフレームワーク
-基本的に再帰処理でタスクを分割する (擬似コード)
doSomething (List<task> tasks) {
if (tasks は小さい) {
task を処理する
}
task1 = tasks.分割(前半);
task2 = tasks.分割(後半);
task1.fork(); // 別スレッドで実行スケジュール
result2 = task2.compute(); // 同じスレッドで実行
result1 = task1.join(); // 実行終了待ち
// 前半部の処理結果と後半部の処理結果をマージする
return merge(result1, result2);
}
-サンプル (テイラー展開でπを求める)
#code(java){{{
package com.mycompany.sandbox;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
public class ForkJoinExam {
public static void main(String[] args) {
ForkJoinPool forkjoin = new ForkJoinPool();
System.out.println(forkjoin.invoke(new TaylorPi()...
}
}
class TaylorPi extends RecursiveTask<Double> {
private List<Long> data;
public TaylorPi() {
data = new ArrayList<>();
for (long l = 0L; l < 10_000_000L; l++) {
data.add(l);
}
}
public TaylorPi(List<Long> data) {
this.data = data;
}
@Override
protected Double compute() {
if (data.size() == 1) {
// データが短ければ自分で処理する
long l = data.get(0);
return 4.0 / (double)(((l & 1) == 0 ? 1L : -1...
}
// データを分割して、並列実行する
int i = data.size() / 2;
// 前半部分は別スレッドで実行
TaylorPi task1 = new TaylorPi(data.subList(0, i));
task1.fork();
// 後半部分は逐次実行し、前半部分の終了を待つ
TaylorPi task2 = new TaylorPi(data.subList(i, dat...
return task2.compute() + task1.join();
}
}
}}}
3.1415925535897915
テイラー展開ならこれくらいが限界かな。あと、これくらいな...
#br
|Double を返すタスク |RecursiveTask<Double>|
|処理結果を返さないタスク|RecursiveAction|
#br
|同期呼び出し |Double|ForkJoinPool#invoke(...
|非同期呼び出し |Future<Double>|ForkJoinPool...
|非同期呼び出し(突き放し実行)|void|ForkJoinPool#execute()|
----
[[Java#JavaSE]]
ページ名:
ISBN10
ISBN13
9784061426061