私は、ループのための1つの非同期メソッドの内部を呼び出すと、リストにそれの未来を追加しています。私はALLOFFは、すべての先物を完了するために待っていると、部分的な結果を返していない理由はわかりません。私のコードの顔をしています。
私は1つのオーバーライドされたメソッドを持っています
@Overide
@Async
CompletableFuture<someType> fetchData()
{
returns new CompletableFuture<someType>();
}
私は別のインスタンスを持つforループに上記の方法呼び出しています。
mehodなFetchDataを持っている一つのインタフェースをimplmentsすべてのBeanを取得します。
Map<String, SomeClass> allBeans =context.getBeansOfType(SomeClass.class);
List<SomeClass> list=
allBeans.values().stream().collect(SomeClass.toList());
for (SomeClass classInstance: list) {
classInstance.fetchData().thenApply(x->{
//Some DB persistence Call
futureList.add(x);
});
}
将来のすべてを完了することができるように、その後、私はALLOFFを適用していますが、それは流れの残りの部分をexcutingすべて、メインスレッドを待っていません。
CompletableFuture<Void> combinedFutures = CompletableFuture.allOf(
futureList.toArray(new CompletableFuture[futureList.size()]));
CompletableFuture<List<futureResponse>> finalList=
combinedFutures.thenApply(v -> {
return futureList.stream().map(m ->
m.join()).collect(Collectors.toList());
});
このリストI内finalList-はすべて完了した先物フェッチ呼び出しによって返されたいです。
finalListでは、私は常に2つのオブジェクトを取得していますが、なFetchDataは(インスタンスの数に基づいて)5回実行取得され、私は完成得ている残りの非同期呼び出しのすべての後にログを見ました。ここでは、誰かの助けがでした。
観察: - 30秒間スリープにメインスレッドを入れた後、私は、リスト内のすべての5つのオブジェクトを持って見ることができました。いくつかのいずれかは、メインスレッドが完全にすべての未来のためにALLOFFで待機していない理由を教えてくださいでした。
あなたが何をしたいのかIIUCは、実行して簡素に行うことができます
CompletableFuture<List<FutureResponse>> = CompletableFuture.supplyAsync(() -> {
// start fetches and collect the individual futures
List<CompletableFuture> fetches =
allBeans.values().stream()
.map(SomeClass::fetchData)
.collect(toList());
// join all futures and return the list of the results
return fetches.stream()
.map(CompletableFuture::join)
.collect(toList());
}
私はあなたが(すなわちにマップする単一のストリームでそれを行うことができないと思いますfetch
し、すぐに、join
次の未来が作成される前に、参加のためにそれを待つ可能性があるため)。