Возможен ли параллельный ForEach до Java 8? - PullRequest
0 голосов
/ 03 октября 2018

Мы все знаем, что потоки позволяют нам параллельное выполнение foreach, например (фактический код не важен):

Arrays.stream(ints).parallel()...

C # имеет нечто похожее в виде:

ints.AsParallel().Select(int=> ....

Но!Он также имеет следующий синтаксис, который может быть или не быть старше, чем выше:

Parallel.ForEach(ints, anInt => {});

Что подводит меня к моему вопросу - был ли в Java способ сделать параллельный foreach относительно просто до Java 8?Поиск в Google, кажется, не дает результатов, я также попробовал пару статей здесь , здесь , о Baeldung и т. Д., И не вижу более старого способа сделать это.

Есть ли один?

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

Вы можете выполнять параллельную обработку, начиная с Java7, т.е. до Java8, используя среду Fork / Join.Но вы должны разделить источник данных по своему усмотрению и обернуть код в подкласс ForkJoinTask, обычно используя один из его более специализированных типов, либо RecursiveTask (который может возвращать результат), либо RecursiveAction.В вашем случае, поскольку оно не имеет возвращаемого значения, вы должны заключить код в RecursiveAction и отправить все подзадачи в общий пул Fork / Join.

0 голосов
/ 03 октября 2018

Хорошо, если вы посмотрите, как все это делается, используя Spliterator (очень упрощенно): он просто разбивает данные на более мелкие части, если известен размер источника (или создает буфер, если, например, ваш источник).это Iterator, и вы не знаете его размер), теоретически вы можете сделать это с помощью простого ThreadPool и передать каждый кусок в поток, а затем вычислить результат путем объединения этих результатов.

По общему признанию, это было бы довольно сложно, особенно если учесть, что ForkJoinPool использует так называемый алгоритм кражи работы - и это будет нелегко реализовать с помощью пула, я полагаю.Но ForkJoinPool был введен в Java-7, даже если в Java-8 он имеет некоторые небольшие изменения, если я правильно помню.Так что да, это можно было сделать до java-8, но это было бы непросто.

0 голосов
/ 03 октября 2018

Не совсем, но Java 7 добавила ForkJoinPool , который специально предназначался для параллельного выполнения разложенных подзадач (частей более крупной задачи).Это может быть легко применено к Collection.

. В Java 5 также добавлен ThreadPoolExecutor , который не предназначен специально для выполнения разложенных подзадач, но он все еще может использоваться для него снемного больше работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...