我想知道是否存在用于从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)});
答案 0 :(得分:4)
由于您接受了执行异步调用的答案,因此不清楚为什么您首先要求“同步方法调用”。使用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
阶段确保在syncMethodCall
引发异常的情况下,join
不会,因为这似乎是您的意图。但是不返回handle
阶段,而是返回记录例外的原始未来
请注意,使用当前实现可以在调用者的线程中执行所有操作:
return CompletableFuture.completedFuture("hello")
.thenApply(parameters -> syncMethodCall(parameters));
当未来已经完成时,将立即评估传递给thenApply
的函数。但是,syncMethodCall
抛出的异常仍记录在返回的未来中。所以结果与你问题的“长版”相同。
答案 1 :(得分: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));