Условия, с которыми следует быть осторожным при использовании параллельных потоков

#java #java-stream

Вопрос:

Какое условие требуется для использования параллельных потоков в java 8? Можем ли мы использовать его во всех случаях или это может вызвать некоторые проблемы в некоторых случаях, или мы должны что-то гарантировать перед его использованием?

Комментарии:

1. Хороший вопрос, над которым стоит подумать. Не тот форум, чтобы задавать такой широкий вопрос. Возможно, вам захочется сначала поискать, а затем свести все к конкретной проблеме, если вы ее обнаружите.

2. Ожидается, что вы проведете исследование, прежде чем размещать вопросы здесь. Например: использование поисковой системы. Чтение существующей документации, например docs.oracle.com/javase/tutorial/collections/streams/…

3. @Naman: Я согласен. К сожалению, пользователям StackOverflow не нравятся простые вопросы, требующие сложного ответа, и они голосуют за то, чтобы закрыть их как слишком широкие или требующие большего внимания. Это правильный вопрос, ИМХО.

4. @NikolasCharalambidis, как написано выше: это сообщество также ожидает, что пользователи проведут предварительное исследование. Что здесь не совсем видно. И что ОП не реагирует ни на какие комментарии или даже на данный ответ … не помогает чувство, что это довольно плохой вопрос.

5. Параллельная обработка обходится дорого. Вы должны разделить источник на несколько блоков, вы должны передать эти блоки нескольким работникам, и если вы выполняете агрегацию, вам нужно дождаться завершения локальных агрегаций и, наконец, объединить эти локальные агрегации в конечный результат. Используйте его только в том случае, если ваши входные данные большие и их безопасно обрабатывать не по порядку. Кроме того, внимательно прочитайте документацию по каждой операции. Хотя о большинстве этих документов следует позаботиться даже в непараллельном режиме, параллельно они могут сломать вам шею (например, функции фильтра с отслеживанием состояния).

Ответ №1:

Самое первое, что нужно понять: ключевое различие заключается не в последовательных или параллельных потоках.

Потоки-это всего лишь одна конкретная концепция в java, предназначенная для выражения обработки данных аккуратными и лаконичными способами. Значение: вы можете выполнять последовательную или параллельную обработку, полностью независимую от потоков.

Что приводит к следующему: реальный вопрос заключается в том, позволяет ли проблема, которую вы собираетесь решить, выполнять параллельную обработку. Многие так делают, другие-нет. Например: могут возникнуть ситуации, когда вам абсолютно необходимо обработать «события» в том порядке, в котором они произошли. Тогда параллельная обработка «потока» таких «событий» является абсолютным запретом. Потому что параллель всегда означает: потерю контроля над порядком обработки.

Помимо этого, есть еще один аспект: производительность!

Имейте в виду: параллельная обработка-это компромисс. Вы готовы вложить больше ресурсов процессора (также: сложность кода), чтобы вычислить какой-то результат раньше. Теперь: иногда этот компромисс просто не стоит того. Когда вы измерите последовательную и параллельную потоковую обработку, вы обнаружите, что (в зависимости от многих аспектов): настройка самого параллельного потока является довольно дорогостоящей операцией. Значение: если ваша задача состоит в сортировке 5 объектов, то выполнение этого последовательно всегда будет быстрее по сравнению с параллельным выполнением. Потому что последовательная сортировка будет выполняться задолго до того, как параллельный код действительно приступит к сортировке!