Возвращает ли сборщик снимок списка при запуске в параллельном потоке? - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть модульный тест, который начал проваливаться только на Circle CI . Ошибка в последней строке в этом (Kotlin) примере:

generator.generateNames(50) // returns List<String>
.parallelStream()
.map { name ->
    val playerId = "${name.firstName.toLowerCase()}"
    Player(playerId = playerId)
}.collect(Collectors.toList()).last()

метание: Caused by: java.util.NoSuchElementException.

Он всегда работает на моей локальной машине или на Circle CI, если я не использую параллельный поток. Моя теория состоит в том, что вызов collect возвращает снимок списка (он фактически не блокируется, пока список полностью не заполнен), и что у CI недостаточно ЦП для сбора одного элемента в других потоках?

Тем не менее, мой поток упорядочен, и так ли Коллектор прав? Это даже собирать параллельно?

1 Ответ

0 голосов
/ 19 ноября 2018

Исключение, которое вы получаете, вероятно, содержит в себе сообщение, а не только имя исключения.Это сообщение, скорее всего, говорит вам об ошибке.Например, последняя часть вашего кода вызывает функцию расширения Kotlin last(), которая в реализации:

public fun <T> List<T>.last(): T {
    if (isEmpty())
        throw NoSuchElementException("List is empty.")
    return this[lastIndex]
}

Так что, если вы видите сообщение «Список пуст» в трассировке стека для java.util.NoSuchElementExceptionтогда это причина.

Кроме того, если вы поделитесь трассировкой стека, вы действительно сможете увидеть, что вызывает исключение.Но, глядя на ваш код, это единственный вероятный кандидат.

Тогда возникает вопрос: «Почему окончательный список пуст ?!»... generateNames(50) работает по-другому в этой среде?Проблема не в collect(Collectors.toList()), который дает синхронный результат.

...