Collection.parallelStream()
- это простой способ сделать асинхронный материал для коллекции.Вы можете изменить свой код следующим образом:
public List<Integer> afterFilteringList(List<Integer> initialList){
List<Integer> afterFilteringList =initialList
.parallelStream()
.filter(this::makeNetworkCallAndCheck)
.collect(Collectors.toList());
return afterFilteringList;
}
public Boolean makeNetworkCallAndCheck(Integer value){
return resultOfNetWorkCall(value);
}
Вы можете настроить своего исполнителя, набрав таким образом .И порядок результата гарантирован в соответствии с this .
Я написал следующий код, чтобы проверить мои слова.
public class DemoApplication {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ForkJoinPool forkJoinPool = new ForkJoinPool(50);
final List<Integer> integers = new ArrayList<>();
for (int i = 0; i < 50; i++) {
integers.add(i);
}
long before = System.currentTimeMillis();
List<Integer> items = forkJoinPool.submit(() ->
integers
.parallelStream()
.filter(it -> {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return true;
})
.collect(Collectors.toList()))
.get();
long after = System.currentTimeMillis();
System.out.println(after - before);
}
}
Я создаю свой собственный ForkJoinPool
и мне требуется 10019 миллисекунд, чтобы завершить 50 заданий параллельно, хотя каждое из них стоит 10000 миллисекунд.