Не получается разобраться с CountedCompleter
Пытаюсь написать вычисление суммы всех значений в списке, используя CountedCompleter. Код работает, но в 1 случае из 100 результат получается неправильный. Выяснил, что в этом кейсе почему-то метод onComplete не вызывается от дочерней задачи. Что я делаю не так? Код приложил.
class MyTask extends CountedCompleter<Integer> {
private int result;
private final List<Integer> list;
private MyTask sibling;
public MyTask(List<Integer> list) {
this.list = list;
}
public MyTask(MyTask myTask, List<Integer> list) {
super(myTask);
this.list = list;
}
@Override
public void compute() {
if (list.size() > 2) {
setPendingCount(2);
var t1 = new MyTask(this, list.subList(0, list.size() / 2));
var t2 = new MyTask(this, list.subList(list.size() / 2, list.size()));
t1.sibling = t2;
t2.sibling = t1;
t1.fork();
t2.fork();
} else {
result = list.stream().mapToInt(v -> v).sum();
}
tryComplete();
}
@Override
public void onCompletion(CountedCompleter<?> caller) {
if (caller != this) {
var child = (MyTask) caller;
var sib = child.sibling;
result = child.result + sib.result;
}
}
@Override
public Integer getRawResult() {
return result;
}
}
UPD. Заметил, что такое поведение наблюдается, когда форки выполнились до вызова tryComplete(). Поэтому, если после вызова форков в коде добавить таймаут, неправильное поведение будет в 100% случаев.