2

synchron メソッド呼び出しから CompletableFuture を作成するためのワンライナーが存在するかどうかを知りたいです。いいえの場合、なぜですか?

長いバージョン:

final CompletableFuture<ReturnType> future = new CompletableFuture<>();
final String parameters = "hello";
ReturnType result;
try {
    result = syncMethodCall(parameters);
} catch (Exception e) {
    future.completeExceptionally(e);
}
future.complete(result);
return future;

短い希望のバージョン (または種類):

final String parameters = "hello";
return CompletableFuture.superMethod(() -> {syncMethodCall(parameters)});
4

2 に答える 2

9

非同期呼び出しを実行する回答を受け入れたため、そもそも「同期メソッド呼び出し」を要求した理由は不明です。非同期メソッド呼び出しを実行するタスクは、以下を使用すると非常に簡単CompletableFutureです。

String parameters="hello";
return CompletableFuture.supplyAsync(() -> syncMethodCall(parameters));

あなたの意図が、未来が戻ったときにすでに完了していることを強制することであった場合、強制するのは簡単です:

String parameters="hello";
CompletableFuture<ReturnType> f = CompletableFuture.supplyAsync(
                                      () -> syncMethodCall(parameters));
f.handle((x,y) -> null).join();
return f;

handle前の段階では、例外がスローされた場合に備えて、それがあなたの意図のように見えないjoinことを保証します。ただし、ステージは返されません。代わりに、例外が記録された元の未来が返されます。 現在の実装では、呼び出し元のスレッド内ですべてを行うためのトリックがあることに注意してください。syncMethodCalljoinhandle

return CompletableFuture.completedFuture("hello")
    .thenApply(parameters -> syncMethodCall(parameters));

に渡された関数はthenApply、フューチャーが既に完了しているときにすぐに評価されます。それでも、によってスローされた例外syncMethodCallは、返された future に記録されます。したがって、結果は質問の「長いバージョン」と同じです。

于 2016-06-20T16:39:06.160 に答える
0

CompletableFuture を何らかのメソッド呼び出しの結果で完成させたいので、その CompletableFuture を自分で完成させたくないので、CompletableFuture は必要ありません。Future の実装は問題ありません。例えば、

T function(parameters) {
  return new T();
}
T res1 = function(parameters); // sync call
Future<T> f = ForkJoinPool.commonPool.submit(() -> function(parameters));  // async call
T res2 =  f.get();
assert(res1.equals(res2));
于 2016-06-16T16:12:17.837 に答える