Не получается разобраться с 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% случаев.


Ответы (0 шт):