Параллельные потоки, возвращающие логическое значение, которые вначале дают сбой или преуспевают при оценке всего кода - PullRequest
0 голосов
/ 01 февраля 2020

Хорошо, работая с Java 8, нужно знать, выполняет ли мой код ниже то, что мне нужно.

  • У меня есть три метода. Каждый из них выполняет операцию и возвращает успех или неудачу как логическое значение.
  • Мне нужно, чтобы все три работали одновременно.
  • Если кто-либо возвращает false, первое, что нужно сделать это приведет к короткому замыканию всего процесса, и мастер-метод вернет false.
  • Если ни один из них не вернет false, все три должны завершиться и вернуть true для основного метода вернуть true.

Мой код:

private boolean checkProcess1(){
    //does stuff, mostly DB schema checking
}

private boolean checkProcess2(){
    //does stuff, mostly queries on a different DB
}

private boolean checkProcess3(){
    //does stuff, checking files and versioning
}

public boolean checkProcessesForSuccess(){
    final List<Supplier<Boolean>> checkList = Arrays.asList(
        this::checkProcess1,
        this::checkProcess2,
        this::checkProcess3
    );
    return checkList.parallelStream().allMatch( Supplier :: get );
}

Моя основная точка преткновения касается .allMatch(). Предполагается принять предикат, который определяет, как оценивается каждый элемент в списке. Передавая Supplier :: get, он не возвращает true на любом полном наборе совпадений, таких как все значения false, или требует, чтобы все значения были true в порядке для возврата true?

Кроме того, если первый метод, возвращающий результат, - false, это приводит к короткому замыканию всего основного метода или продолжает обработку до тех пор, пока все три не будут завершены? Меня беспокоит то, что если кратковременный метод возвращает false, вся система будет связана с самым продолжительным методом.

Я ранее пытался использовать CompletableFuture для этой проблемы, и я действительно придумал решение, но оно было немного более сложным и - честно - довольно не элегантным и безобразным. Я обратился к Streams, пытаясь понять, можно ли решить проблему более простым и элегантным способом.

Предложения?

1 Ответ

3 голосов
/ 01 февраля 2020

Передавая Supplier :: get, он не возвращает true для какого-либо полного набора совпадений, таких как все ложные значения, или требуется, чтобы все значения были true для возврата true?

Требуется, чтобы все supplier.get возвращали true, чтобы в конечном итоге возвращать true как полный результат из checkProcessesForSuccess.

Дополнительно, если первый метод возвращает результат имеет значение false, вызывает ли это короткое замыкание всего основного метода или продолжает обработку до тех пор, пока все три не будут завершены? .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...