2017-04-05 96 views
5

listesinde akışı için en etkili yol Bir nesne listesi üzerinden aktararak bir async istemci yöntemini arıyorum. Yöntem, Gelecek'i döndürür.Futures

Çağrıdan sonra geri dönen Vadeli İşlemler listesi üzerinde yineleme yapmanın en iyi yolu nedir (ilk önce gelenleri işlemek için)?

Not: Async istemcisi yalnızca Gelecekte Değil CompletableFuture değerini döndürür.

ardından kodudur:

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

Bir CompletionService kullanarak yerine bir diziye sonuçları haritalama içine baktın mı? http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CompletionService.html –

+0

Belki de [CompletionService] 'ı deneyin (http://docs.oracle.com/javase/7/docs/ aPI/java/util/eşzamanlı/CompletionService.html)? İşte bir [açıklama] (http://stackoverflow.com/a/19348417/6785649). –

+3

'Gelecek '' i üreten bir kod üzerinde denetiminiz yoksa veya bir" Çalıştırıcıya "gönderdiğinde," Tamamlama Hizmeti "işlevi oldukça kullanışsızdır. – Holger

cevap

3

List<Future<Object>> bu listenin olması, bunun yerine varsayılan akış paralel işlem kullanmak yerine, özel bir havuza iletecek.

Bunun nedeni, stream API'nin paralel işleme için ortak bir havuz kullanması ve bu Futures'lar üzerinde get'u arayabilmesidir (işlem için önemli zaman alırsa) - uygulamanız içinde paralel işlemleri kullanan tüm diğer akış işlemlerini engellersiniz. Bu bitti.

Bu olur böyle biraz:

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

ben gibi özel havuzlu gider gösterilen here