Почему код не работает в режиме parallel() , но прекрасно работает в обычном режиме?

 
 
 
Сообщения:4
Вот он код:
rows = types.stream().parallel().map(s -> {
    switch (s){
        case NDBaseDocumentModel.DOC_TYPE_NSS:
            return getDocsOfSpecificTypeAndCountItsDupes(NDGostStandardsModel.TYPE_ND_GOST_STANDARDS, null,systemMessages.getString("form20.nss.name")).values();
        case NDBaseDocumentModel.DOC_INT_REG_STANDARDS:
            return getDocsOfSpecificTypeAndCountItsDupes(NDIntRegStandardsModel.TYPE_ND_INT_REG_STANDARDS, null,systemMessages.getString("form20.int_reg")).values();
    }
    return new HashSet<Form20Row>();
}).flatMap(o -> {
    return o.stream();
}).collect(Collectors.toList());

Если убрать вызов parallel() то код как и ожидается выдаёт множество объектов Form20Row в коллекции. Если добавить вызов parallel() то код выдаёт ноль объектов в коллекции.
Скажите пожалуйста, почему так и что я делаю не правильно для параллельного режима обработки? Мне обязательно нужен параллельный режим т.к. коллекции очень большие.
Спасибо!

life though, stay hard
 
 
Сообщения:322
В том, что приведено, вроде бы все нормально. А вот метод getDocsOfSpecificTypeAndCountItsDupes подозрительный. Он потокобезопасный? Может быть, внутри него какие-то общие переменные и при вызове из нескольких потоков все перепутывается и в результате получается пустая коллекция.
 
 
Сообщения:4
maxkar:
В том, что приведено, вроде бы все нормально. А вот метод getDocsOfSpecificTypeAndCountItsDupes подозрительный. Он потокобезопасный? Может быть, внутри него какие-то общие переменные и при вызове из нескольких потоков все перепутывается и в результате получается пустая коллекция.

Это правда он не потокобезопасный и поэтому все падает.

life though, stay hard
Изменен:27 авг 2020 11:10
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет