Visitar URL original
포크조인 코드 주석 · java8/Java8InAction@426a7d9 · GitHub
Skip to content

Commit 426a7d9

Browse files
committed
포크조인 코드 주석
1 parent dcf877d commit 426a7d9

1 file changed

Lines changed: 27 additions & 6 deletions

File tree

‎src/main/java/lambdasinaction/chap7/ForkJoinSumCalculator.java‎

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,36 +8,57 @@
88

99
public class ForkJoinSumCalculator extends RecursiveTask<Long> {
1010

11+
//이 값 이하의 서브태스크는 더이상 분할할 수 없다. (threshold : 임계치)
1112
public static final long THRESHOLD = 10_000;
1213

13-
private final long[] numbers;
14-
private final int start;
15-
private final int end;
14+
private final long[] numbers; // 더할 숫자 배열
15+
private final int start; //이 서브태스크에서 처리할 배열의 초기 위치
16+
private final int end; //이 서비태스크에서 처리할 배열의 최종 위치
1617

18+
//메인 태스크를 생성할 때 사용할 공개 생성자
1719
public ForkJoinSumCalculator(long[] numbers) {
1820
this(numbers, 0, numbers.length);
1921
}
2022

23+
// 메인 태스크의 서브태스크를 재귀적으로 만들때 사용할 비공개 생성자
2124
private ForkJoinSumCalculator(long[] numbers, int start, int end) {
2225
this.numbers = numbers;
2326
this.start = start;
2427
this.end = end;
2528
}
2629

30+
/**
31+
* RecursiveTask의 추상 메서드 오버라이드
32+
* @return
33+
*/
2734
@Override
2835
protected Long compute() {
29-
int length = end - start;
36+
int length = end - start; // 이 태스크에서 더할 배열의 길이
37+
38+
// 기준값과 같거나 작으면 순차적으로 결과를 계산한다.
3039
if (length <= THRESHOLD) {
3140
return computeSequentially();
3241
}
42+
43+
// 배열의 첫번째 절반을 더하도록 서브태스크를 생성
3344
ForkJoinSumCalculator leftTask = new ForkJoinSumCalculator(numbers, start, start + length/2);
34-
leftTask.fork();
45+
leftTask.fork(); // ForkJoinPool의 다른 스레드로 새로 생성한 태스크를 비동기로 실행한다.
46+
47+
//배열의 나머지 절반을 더하도록 서브태스크를 생성
3548
ForkJoinSumCalculator rightTask = new ForkJoinSumCalculator(numbers, start + length/2, end);
36-
Long rightResult = rightTask.compute();
49+
Long rightResult = rightTask.compute(); //두 번째 서브태스크를 동기 실행. 이때 추가로 분할이 일어날 수 있음
50+
51+
//첫 번째 서브태스크의 결과를 읽거나 아직 결과가 없으면 기다린다.
3752
Long leftResult = leftTask.join();
53+
54+
//두 서브태스크의 결과를 조합한 값이 이 태스크의 결과다.
3855
return leftResult + rightResult;
3956
}
4057

58+
/**
59+
* 더 분할할 수 없을 때 서브태스크의 결과를 계산하는 단순 알고리즘
60+
* @return
61+
*/
4162
private long computeSequentially() {
4263
long sum = 0;
4364
for (int i = start; i < end; i++) {

0 commit comments

Comments
 (0)