2017-04-05 19 views
5

Wywołuję metodę klienta asynchronicznego, przesyłając strumieniowo listę obiektów. Metoda zwraca Future.Najbardziej efektywny sposób przesyłania strumieniowego na liście kontraktów Futures

Jaki jest najlepszy sposób na powtórzenie listy Futures zwróconych po zakończeniu połączenia (aby przetworzyć te Future, które są pierwsze)?

Uwaga: Klient asynchroniczny zwraca tylko wartość Future not CompletableFuture.

Poniżej znajduje się kod:

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

Czy patrzysz w użyciu CompletionService zamiast mapowania wyniki do tablicy? http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CompletionService.html –

+0

Być może spróbuj [CompletionService] (http://docs.oracle.com/javase/7/docs/ api/java/util/concurrent/CompletionService.html)? Oto [wyjaśnienie] (http://stackoverflow.com/a/19348417/6785649). –

+3

"Usługa Completion" jest zupełnie bezużyteczne, jeśli nie masz kontroli nad kodem, który produkuje 'Przyszłość'/przesyła pracę do' Executora'. – Holger

Odpowiedz

3

Mając tę ​​listę List<Future<Object>>, chciałbym złożyć go do puli niestandardowej, zamiast przy użyciu domyślnego przetwarzania strumienia równoległego.

Dzieje się tak dlatego, że api stream używa wspólnej puli do przetwarzania równoległego i zadzwonisz pod numer get w tych kontraktach Futures (jeśli proces ten zajmie dużo czasu) - zablokujesz wszystkie inne operacje strumieniowe, które wykorzystują operacje równoległe w aplikacji do momentu ten jest skończony.

To będzie trochę tak:

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

pójdę z niestandardowym basenie jak pokazano here

Powiązane problemy