私はCompletableFuture
がrunAfterBoth
で複数の先物をマージする機能を持っているが、2つ以上をマージしたいのであればどうなるでしょうか?複数の非同期CompletableFuturesの参加を処理する方法は?
CompletableFuture<Boolean> a = new CompletableFuture<>();
CompletableFuture<Boolean> b = new CompletableFuture<>();
CompletableFuture<Boolean> c = new CompletableFuture<>();
List<CompletableFuture<Boolean>> list = new LinkedList<>();
list.add(a);
list.add(b);
list.add(c);
// Could be any number
for (CompletableFuture<Boolean> f : list) {
f.runAfter..
}
私の使用例は、メッセージを複数のソケットに送信して、いずれかのオブジェクトにあるかもしれない単一のオブジェクトを見つけることです。
私は現在、解決策として、これを探しています:
CompletableFuture<Boolean> a = new CompletableFuture<>();
CompletableFuture<Boolean> b = new CompletableFuture<>();
CompletableFuture<Boolean> c = new CompletableFuture<>();
List<CompletableFuture<Boolean>> list = new LinkedList<>();
list.add(a);
list.add(b);
list.add(c);
CompletableFuture<Boolean> result = new CompletableFuture<>();
Thread accept = new Thread(() -> {
for (CompletableFuture<Boolean> f : list)
if (f.join() != null)
result.complete(f.join());
});
accept.start();
// Actual boolean value returned
result.get();
しかし、それは混乱のようなものです。私の場合は、無効な結果を待つのではなく、有効な結果(nullではない)を取得するとすぐに処理を続けたいと思います。
たとえば、a
は5秒かかり、b
がすでに2秒で完了していてもループが待機しています。ループはそれがまだa
を待っているのでそれを知らない。
正常終了時にすぐに対応できる複数の非同期先物を結合するパターンがありますか?
別の可能性:
public static class FutureUtil {
public static <T> CompletableFuture<T> anyOfNot(
Collection<CompletableFuture<T>> collection,
T value,
T defaultValue)
{
CompletableFuture<T> result = new CompletableFuture<>();
new Thread(() -> {
for (CompletableFuture<T> f : collection) {
f.thenAccept((
T r) -> {
if ((r != null && !r.equals(value))
|| (value != null && !value.equals(r)))
result.complete(r);
});
}
try {
for (CompletableFuture<T> f : collection)
f.get();
}
catch (Exception ex) {
result.completeExceptionally(ex);
}
result.complete(defaultValue);
}).start();
return result;
}
}
使用例:
CompletableFuture<Boolean> a = new CompletableFuture<>();
CompletableFuture<Boolean> b = new CompletableFuture<>();
CompletableFuture<Boolean> c = new CompletableFuture<>();
List<CompletableFuture<Boolean>> list = new LinkedList<>();
list.add(a);
list.add(b);
list.add(c);
CompletableFuture<Boolean> result = FutureUtil.anyOfNot(list, null, false);
result.get();
を探しています:もっと複雑なものが必要#allOf-java.util.concurrent.CompletableFuture ...-)? – teppic
並べ替えそのうちの1つが既に有効な結果(nullではない)で完了している場合、他の先物については待っていません。 – Zhro
多分['anyOf'](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html#anyOf-java.util.concurrent.CompletableFuture...- )? – Marco13