-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSumTask.java
More file actions
54 lines (44 loc) · 1.78 KB
/
Copy pathSumTask.java
File metadata and controls
54 lines (44 loc) · 1.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package parallel.forkjoin;
import parallel.HeavyJob;
import util.MyLogger;
import java.util.List;
import java.util.concurrent.RecursiveTask;
import static util.MyLogger.*;
public class SumTask extends RecursiveTask<Integer> {
// private static final int THRESHOLD = 4;
private static final int THRESHOLD = 2;
private final List<Integer> list;
public SumTask(List<Integer> list) {
this.list = list;
}
@Override
protected Integer compute() {
// 작업 범위가 작으면 직접 합산
if(list.size() <= THRESHOLD){
log("[처리 시작]" + list);
int sum = list.stream()
.mapToInt(HeavyJob::headvyTask)
.sum();
log("[처리 완료] " + list + " -> sum: " + sum);
return sum;
}else {
// 작업 범위가 크면 반으로 나누어 병렬 처리
int mid = list.size()/2; // 2
List<Integer> leftList = list.subList(0, mid);
List<Integer> rightList = list.subList(mid, list.size());
log("[분할] " + list + " -> LEFT : " + leftList + ", RIGHT" + rightList);
SumTask leftTask = new SumTask(leftList);
SumTask rightTask = new SumTask(rightList);
// 왼쪽 작업은 다른 스레드에서 처리
leftTask.fork();
// 오른쪽 작업은 현재 스레드에서 처리
int rightResult = rightTask.compute();
// 왼쪽 작업을 기다림
int leftResult = leftTask.join();
// 왼쪽과 오른쪽 작업 결과를 합침
int joinSum = leftResult + rightResult;
log("LEFT[ " + leftResult + "] + RIGHT[" + rightResult +"] -> sum: " + joinSum);
return joinSum;
}
}
}