Repository navigation
Expand file tree
/
Copy pathSumRecursiveTask.java
More file actions
74 lines (52 loc) · 2.13 KB
/
Copy pathSumRecursiveTask.java
File metadata and controls
74 lines (52 loc) · 2.13 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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package modern.challenge;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
import java.util.logging.Logger;
public class SumRecursiveTask extends RecursiveTask<Integer> {
private static final Logger logger = Logger.getLogger(SumRecursiveTask.class.getName());
private static final int THRESHOLD = 10;
private final List<Integer> worklist;
public SumRecursiveTask(List<Integer> worklist) {
this.worklist = worklist;
}
@Override
protected Integer compute() {
if (worklist.size() <= THRESHOLD) {
return partialSum(worklist);
}
/*
int size = worklist.size();
List<Integer> worklistLeft = worklist.subList(0, (size + 1) / 2);
List<Integer> worklistRight = worklist.subList((size + 1) / 2, size);
SumRecursiveAction leftTask = new SumRecursiveAction(worklistLeft);
leftTask.fork();
SumRecursiveAction rightTask = new SumRecursiveAction(worklistRight);
Integer secondTaskResult = rightTask.compute();
Integer firstTaskResult = leftTask.join();
return firstTaskResult + secondTaskResult;
*/
return ForkJoinTask.invokeAll(createSubtasks())
.stream()
.mapToInt(ForkJoinTask::join)
.sum();
}
private List<SumRecursiveTask> createSubtasks() {
List<SumRecursiveTask> subtasks = new ArrayList<>();
int size = worklist.size();
List<Integer> worklistLeft = worklist.subList(0, (size + 1) / 2);
List<Integer> worklistRight = worklist.subList((size + 1) / 2, size);
subtasks.add(new SumRecursiveTask(worklistLeft));
subtasks.add(new SumRecursiveTask(worklistRight));
return subtasks;
}
private Integer partialSum(List<Integer> worklist) {
int sum = worklist.stream()
.mapToInt(e -> e)
.sum();
logger.info(() -> "Partial sum: " + worklist + " = "
+ sum + "\tThread: " + Thread.currentThread().getName());
return sum;
}
}