Java-карта параллельных потоков пропускает записи - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть следующий код, и он иногда ведет себя недетерминированно.Например, я пропускаю 3 события, а на выходе есть только два!Не могли бы вы объяснить причину такого поведения?

public List<AbstractTransactionResponse> getEventResponse(final List<AbstractEvent> events){

        List<AbstractTransactionResponse> abstractTransactionResponses = new ArrayList<>();
        events.parallelStream().map(event -> {
            abstractTransactionResponses.add(getEventResponse(event));
            return null;
        }).collect(Collectors.toList());
        return abstractTransactionResponses;
    }

1 Ответ

0 голосов
/ 19 декабря 2018

поскольку вы параллельно добавляете коллекцию, которая не является поточно-ориентированной, вы можете увидеть пропущенные записи, null s в вашем списке вывода - действительно неизвестно, что произойдет.Вместо этого исправьте ваш код:

return events.parallelStream()
             .map(this::getEventResponse)
             .collect(Collectors.toList());

map, как предполагается, не имеет побочных эффектов, и ваша операция map, очевидно, имеет, это то, что документация запрещает.Также имейте в виду, что parallel! = faster примерно в 99% случаев, вам нужно измерить это, но я сомневаюсь, что вам это нужно.

...