从同步方法调用创建CompletableFuture

时间:2016-06-16 15:12:51

标签: java asynchronous lambda java-8 completable-future

我想知道是否存在用于从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)});

2 个答案:

答案 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));