|
8 | 8 |
|
9 | 9 | public class ForkJoinSumCalculator extends RecursiveTask<Long> { |
10 | 10 |
|
| 11 | + //이 값 이하의 서브태스크는 더이상 분할할 수 없다. (threshold : 임계치) |
11 | 12 | public static final long THRESHOLD = 10_000; |
12 | 13 |
|
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; //이 서비태스크에서 처리할 배열의 최종 위치 |
16 | 17 |
|
| 18 | + //메인 태스크를 생성할 때 사용할 공개 생성자 |
17 | 19 | public ForkJoinSumCalculator(long[] numbers) { |
18 | 20 | this(numbers, 0, numbers.length); |
19 | 21 | } |
20 | 22 |
|
| 23 | + // 메인 태스크의 서브태스크를 재귀적으로 만들때 사용할 비공개 생성자 |
21 | 24 | private ForkJoinSumCalculator(long[] numbers, int start, int end) { |
22 | 25 | this.numbers = numbers; |
23 | 26 | this.start = start; |
24 | 27 | this.end = end; |
25 | 28 | } |
26 | 29 |
|
| 30 | + /** |
| 31 | + * RecursiveTask의 추상 메서드 오버라이드 |
| 32 | + * @return |
| 33 | + */ |
27 | 34 | @Override |
28 | 35 | protected Long compute() { |
29 | | - int length = end - start; |
| 36 | + int length = end - start; // 이 태스크에서 더할 배열의 길이 |
| 37 | + |
| 38 | + // 기준값과 같거나 작으면 순차적으로 결과를 계산한다. |
30 | 39 | if (length <= THRESHOLD) { |
31 | 40 | return computeSequentially(); |
32 | 41 | } |
| 42 | + |
| 43 | + // 배열의 첫번째 절반을 더하도록 서브태스크를 생성 |
33 | 44 | ForkJoinSumCalculator leftTask = new ForkJoinSumCalculator(numbers, start, start + length/2); |
34 | | - leftTask.fork(); |
| 45 | + leftTask.fork(); // ForkJoinPool의 다른 스레드로 새로 생성한 태스크를 비동기로 실행한다. |
| 46 | + |
| 47 | + //배열의 나머지 절반을 더하도록 서브태스크를 생성 |
35 | 48 | ForkJoinSumCalculator rightTask = new ForkJoinSumCalculator(numbers, start + length/2, end); |
36 | | - Long rightResult = rightTask.compute(); |
| 49 | + Long rightResult = rightTask.compute(); //두 번째 서브태스크를 동기 실행. 이때 추가로 분할이 일어날 수 있음 |
| 50 | + |
| 51 | + //첫 번째 서브태스크의 결과를 읽거나 아직 결과가 없으면 기다린다. |
37 | 52 | Long leftResult = leftTask.join(); |
| 53 | + |
| 54 | + //두 서브태스크의 결과를 조합한 값이 이 태스크의 결과다. |
38 | 55 | return leftResult + rightResult; |
39 | 56 | } |
40 | 57 |
|
| 58 | + /** |
| 59 | + * 더 분할할 수 없을 때 서브태스크의 결과를 계산하는 단순 알고리즘 |
| 60 | + * @return |
| 61 | + */ |
41 | 62 | private long computeSequentially() { |
42 | 63 | long sum = 0; |
43 | 64 | for (int i = start; i < end; i++) { |
|
0 commit comments