2017-04-05 1 views
5

개체 목록을 스트리밍하여 비동기 클라이언트 메서드를 호출하고 있습니다. 이 메서드는 Future를 반환합니다.Futures 목록에서 스트림하는 가장 효율적인 방법

통화 후 반환 된 선물 목록을 반복하는 가장 좋은 방법은 무엇입니까 (이후에 나오는 Future를 처리하기 위해).

참고 : 비동기 클라이언트는 Future Not CompletableFuture 만 반환합니다.

다음은 코드입니다 :

List<Future<Object>> listOfFuture = objectsToProcess.parallelStream() 
    .map((object) -> { 
     /* calling an async client returning a Future<Object> */ }) 
    .collect(Collectors.toList()); 
+0

당신이 CompletionService에를 사용하는 대신 배열에 결과를 매핑 조사 했습니까? http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CompletionService.html –

+0

[CompletionService] (http://docs.oracle.com/javase/7/docs/)를 사용해보십시오. api/java/util/concurrent/CompletionService.html)? 여기에 [설명]이 있습니다 (http://stackoverflow.com/a/19348417/6785649). –

+3

'CompletionService'는'Future'를 생성하는 코드에 대한 제어권이 없거나'Executor'에 작업을 제출하면 쓸모가 없습니다. – Holger

답변

3

List<Future<Object>>의 목록을하는 데, 내가 대신 기본 스트림 병렬 처리를 사용하는 사용자 정의 풀에 제출한다.

이는 스트림 API가 병렬 처리를 위해 공통 풀을 사용하고 해당 선물에 get (처리에 많은 시간이 소요되는 경우)을 호출하기 때문입니다. 응용 프로그램 내에서 병렬 작업을 사용하는 다른 모든 스트림 작업을 차단합니다. 이 일은 끝났어.

이 것이 같은 비트 :

forJoinPool.submit(() -> list.stream().parallel().map(future -> future.get()).collect(Collectors.toList())).get(); 

내가 좋아하는 사용자 정의 풀과 갈 것 같이 here

관련 문제