将Java Future转换为CompletableFuture

Java

8引入CompletableFuture了可组合的Future的新实现(包括一堆thenXxx方法)。我想专门使用它,但是我想使用的许多库仅返回非可组合Future实例。

有没有一种方法可以将返回的Future实例包装在内,CompleteableFuture以便我可以编写它?

回答:

有一种方法,但是您不喜欢它。以下方法将a Future<T>转换为a CompletableFuture<T>

public static <T> CompletableFuture<T> makeCompletableFuture(Future<T> future) {

if (future.isDone())

return transformDoneFuture(future);

return CompletableFuture.supplyAsync(() -> {

try {

if (!future.isDone())

awaitFutureIsDoneInForkJoinPool(future);

return future.get();

} catch (ExecutionException e) {

throw new RuntimeException(e);

} catch (InterruptedException e) {

// Normally, this should never happen inside ForkJoinPool

Thread.currentThread().interrupt();

// Add the following statement if the future doesn't have side effects

// future.cancel(true);

throw new RuntimeException(e);

}

});

}

private static <T> CompletableFuture<T> transformDoneFuture(Future<T> future) {

CompletableFuture<T> cf = new CompletableFuture<>();

T result;

try {

result = future.get();

} catch (Throwable ex) {

cf.completeExceptionally(ex);

return cf;

}

cf.complete(result);

return cf;

}

private static void awaitFutureIsDoneInForkJoinPool(Future<?> future)

throws InterruptedException {

ForkJoinPool.managedBlock(new ForkJoinPool.ManagedBlocker() {

@Override public boolean block() throws InterruptedException {

try {

future.get();

} catch (ExecutionException e) {

throw new RuntimeException(e);

}

return true;

}

@Override public boolean isReleasable() {

return future.isDone();

}

});

}

显然,这种方法的问题在于,对于每个 Future ,都会阻塞线程以等待 Future 的结果-与 Future

的想法相矛盾。在某些情况下,可能会做得更好。但是,总的来说,没有积极等待 Future 的结果就没有解决方案。

以上是 将Java Future转换为CompletableFuture 的全部内容, 来源链接: utcz.com/qa/431286.html

回到顶部