В то время как многие промежуточные операции сохраняют порядок без необходимости явно указывать это желание, я всегда предпочитаю предполагать, что данные, проходящие через поток Java, не гарантируют, что в каждом сценарии заказы не будут упорядочены даже при одинаковом коде.
Когда порядок элементов должен быть сохранен, достаточно указать операцию терминала как упорядоченную операцию, и данные будут в порядке, когда она выйдет.Я полагаю, что в вашем случае вы будете искать
.forEachOrdered()
Если порядок будет сохранен, то как он улучшит производительность при использовании параллельного потока.Какой смысл использовать параллельный поток?
Я слышал много мнений по этому поводу.Я полагаю, что вы должны использовать параллельные потоки, только если вы выполняете нетривиальный объем обработки внутри конвейера, в противном случае накладные расходы на управление параллельным потоком в большинстве случаев ухудшат производительность по сравнению с последовательными потоками.Если вы выполняете некоторую интенсивную обработку, параллель все равно будет работать быстрее, чем последовательная, даже когда будет дано указание сохранить порядок, потому что, в конце концов, обрабатываемые данные хранятся в куче в любом случае, а указатели на эти данные - это то, что упорядочивается ивышел из конца трубы.Все, что нужно сделать потоку для упорядочения, это передать указатели в том же порядке, в котором они встречались, но он может работать с данными параллельно и просто ждать, пока данные в начале очереди еще не завершены.
Я уверен, что это немного упрощает, так как есть случаи, когда упорядоченный поток потребует, чтобы данные передавались из одного элемента в другой (например, сборщики). Но базовая концепция верна, так как даже в этомслучай, когда параллельный поток способен обрабатывать как минимум два фрагмента данных одновременно.