gpt4 book ai didi

java - 从阻塞方法调用创建 CompletableFuture

转载 作者:行者123 更新时间:2023-12-03 12:46:35 24 4
gpt4 key购买 nike

如何将阻塞方法调用“转换”为 CompletableFuture ?示例:

T waitForResult() throws InterruptedException {
obj.await(); // blocking call
// ...
return something;
}

我需要把它变成这样:

CompletableFuture.of(this::waitForResult); // .of(Callable<T>) doesn't exist

一些需要考虑的事情:

  1. waitForResult() 可能会抛出异常。这些必须正确处理,以便 completableFuture.get() 会抛出 InterruptedExceptionExecutionException
  2. 不得涉及其他线程(supplyAsync() 会这样做)。
  3. 它必须是一个 CompletableFuture(可能被包装)。

我试过了,但这不能正确处理异常:

CompletableFuture.completedFuture(Void.TYPE).thenApply(v -> {
try {
listener.await();
// ...
return listener.getResult();
} catch (InterruptedException e) {
throw new RuntimeException(e);
} catch (SnmpException e) {
throw new RuntimeException(e);
}
});

我知道Create CompletableFuture from a sync method call ,但这对我没有帮助:

  • 问题中的原始代码阻塞了主线程
  • 答案中的代码要么合并了第三个线程,要么没有正确处理异常(如果我错了请纠正我)

最佳答案

我不确定我是否理解您的要求。这符合他们的要求吗?

private <T> CompletableFuture<T> supplySynchronously(Callable<T> callable) {
CompletableFuture<T> f = new CompletableFuture<>();
try {
f.complete(callable.call());
} catch (Exception e) {
f.completeExceptionally(e);
}
return f;
}

关于java - 从阻塞方法调用创建 CompletableFuture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56493446/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com