我不認爲任何以前的答案實際上實現了並行性。 @diginoise響應的問題在於它實際上並沒有實現並行性。只要我們撥打get
,我們就會被封鎖。考慮到電話真的很慢,因此future1
需要3秒才能完成,future2
秒和future3
再次需要3秒。隨着3 get
呼叫一個接一個,我們最終等待3 + 2 + 3 = 8秒。 @Vikrant Kashyap答案塊以及while (!(future1 .isDone() && future2.isDone() && future3.isDone()))
。除了while
循環是3期的一段相當醜陋的代碼,如果你有更多的代碼呢? @lkz答案使用的技術與您所要求的不同,即使如此,我也不確定zip
是否可以完成這項工作。從Observable的Javadoc:
拉鍊適用於嚴格的順序這種功能,所以通過新可觀察發出的第一項 將被應用到由每個源可觀察量發射的第一項目的功能 的結果; 由新Observable發射的第二項將是 函數的結果應用於每個發射的第二項的函數 Observable;等等。
由於Spring的廣泛流行,他們非常努力地維護向後兼容性,並且這樣做有時會與API做出妥協。 AsyncRestTemplate
返回的方法ListenableFuture
就是這樣一種情況。如果他們承諾使用Java 8+,則可以使用CompletableFuture
。爲什麼?由於我們不會直接處理線程池,所以我們沒有一個很好的方法來知道所有ListenableFutures何時完成。 CompletableFuture
有一個allOf
方法創建新的CompletableFuture
,當所有給定的CompletableFutures完成時完成。由於我們在ListenableFuture
沒有,我們將不得不即興。 我沒有編譯下面的代碼,但它應該清楚我想要做什麼。我使用Java 8,因爲它是2016年
// Lombok FTW
@RequiredArgsConstructor
public final class CounterCallback implements ListenableFutureCallback<ResponseEntity<String>> {
private final LongAdder adder;
public void onFailure(Throwable ex) {
adder.increment();
}
public void onSuccess(ResponseEntity<String> result) {
adder.increment();
}
}
ListenableFuture<ResponseEntity<String>> f1 = asyncRestTemplate
.getForEntity(url1, String.class);
f1.addCallback(//);
// more futures
LongAdder adder = new LongAdder();
ListenableFutureCallback<ResponseEntity<String>> callback = new CounterCallback(adder);
Stream.of(f1, f2, f3)
.forEach {f -> f.addCallback(callback)}
for (int counter = 1; adder.sum() < 3 && counter < 10; counter++) {
Thread.sleep(1000);
}
// either all futures are done or we're done waiting
Map<Boolean, ResponseEntity<String>> futures = Stream.of(f1, f2, f3)
.collect(Collectors.partitioningBy(Future::isDone));
末我們現在已經一個Map
爲其futures.get(Boolean.TRUE)
會給我們已經完成了所有的期貨和futures.get(Boolean.FALSE)
會給我們沒有的人。我們將要取消那些沒有完成的。
此代碼做了幾件事情,是很重要的並行編程:
- 它不會阻止。
- 它將操作限制在某個最大允許時間內。
- 它明確區分成功和失敗的情況。
請參閱此鏈接中的示例(http://www.concretepage.com/spring-4/spring-4-asyncresttemplate-listenablefuture-example),如果有幫助 –
@vineethsivan鏈接不會回答我的問題。該鏈接僅顯示如何調用future.get()。 – Glide