Существует много вариантов параллельной обработки списка:
Использовать параллельный поток :
objects.stream().parallel().forEach(object -> {
//Your work on each object goes here, using object
})
Используйте службу исполнителя для отправки задач, если вы хотите использовать пул с большим количеством потоков, чем пул с форк-объединением:
ExecutorService es = Executors.newFixedThreadPool(10);
for(Object o: objects) {
es.submit(() -> {
//code here using Object o...
}
}
Этот предыдущий пример по сути аналогичен традиционной службе исполнителя, выполняющей задачи в отдельных потоках.
В качестве альтернативы этому вы также можете отправить, используя завершаемое будущее:
//You can also just run a for-each and manually add each
//feature to a list
List<CompletableFuture<Void>> futures =
objects.stream().map(object -> CompletableFuture.runAsync(() -> {
//Your work on each object goes here, using object
})
Затем вы можете использовать объект futures
для проверки состояния каждого выполнения, если это необходимо.