【发布时间】:2018-02-28 19:04:11
【问题描述】:
我得到了一个 api (fnGrpc),它执行 gRPC 调用并返回解析为某个值 v 的 ListenableFuture(其实现是固定的并且不可修改)。
我想提供一个辅助函数 (fnHelper):
对 gRPC 结果进行一些转换处理,并返回一个
ListenableFuture,解析为转换后的值t1。-
处理 gRPC 调用失败,并返回一些其他值 t2,而不是让 fnHelper 的调用者看到
ExecutionException。
我可以使用Futures.transform()解决(1):
package myHelper;
ListenableFuture<T> fnHelper() {
return Futures.transform(fnGrpc(), new Function<V, T>() {
@Override
public T apply(V v) {
T t1 = f(v);
return t1;
}
});
}
和调用者:
package myApp;
// ...
try {
T t = fnHelper().get();
} catch (ExecutionException | InterruptedException ex) {
// ...
}
如何在 fnHelper 返回 ListenableFuture 并保持非阻塞状态的同时实现 (2)?
我可以让 fnHelper 自己创建一个额外的线程,在其中我会在 fnGrpc 上调用 .get(),但是还有其他方法可以避免这个额外的线程吗? p>
【问题讨论】:
标签: java asynchronous java-8 guava future