考虑调用方的异常处理:它可能期望某些类型的故障导致将来失败,并且可能无法正确处理直接引发异常的方法。
- 不要直接调用任何引发InterruptedException的代码。这肯定表明您正在打破呼叫者对您是否异步的期望。
https://github.com/google/guava/wiki/ListenableFutureExplained中似乎没有涵盖此>
但是很常见的模式
<<@Override public ListenableFuture<Void> loadResources() { fastSyncMethod(); return Futures.immediateFuture(null); }
在此方面是否有指导?在使用ListenableFuture调用或实现API时,我们可以放心地做出一些假设,这会影响到许多使用ListenableFutures的代码用法。
考虑调用方的异常处理:它可能期望某些类型的故障导致将来失败,并且可能无法正确处理直接引发异常的方法。 我的2c [它留下了两个用于错误处理的代码路径,调用代码中的必需 它使syncMethod()的执行时间与调用者是否可以在同步中采用该方法有关。对于高吞吐量代码,即使是将日志语句写入磁盘或使用InetAddress api也是阻塞操作。 作为回报,该实现承诺是非阻塞的。因为它返回 但是,它不必异步运行。 所以,您的示例是反模式吗?这取决于syncMethod
中有什么,但是似乎选择该名称来表示“某些同步通信代码”,在这种情况下,您显示的代码示例显然是反模式。我怀疑它不是在guava文档中涵盖的,仅仅是因为他们从没想过有人会写它。这就好比告诉人们,如果它实际上总是返回null,或者不要将它声明为“ doX”(如果实际上是Y),则不要将其声明为返回对象。签名保证了行为,而返回Future则保证了您(至少有时),返回不完整的未来。不要直接调用任何引发InterruptedException的代码。这肯定表明您正在打破呼叫者对您是否异步的期望。
try {} catch {}
以及ListenableFuture管道中的异常[它打破了期货的某种功能范式,例如参照透明性。
ListenableFuture
,接口或超类ListenableFuture
,所以它有机会将所有昂贵的工作转移到后台线程,使用异步网络调用或其他方法。immediateFuture()
是符合接口的好方法。syncMethod()
的价格。如果速度很快(无阻塞,并且不进行冗长的计算),则该示例很好。如果速度很慢(也许它在网络上等待,或者分解了很大的数字),那么可以,它是一种反模式。
[它留下了两个用于错误处理的代码路径,调用代码中的必需try {} catch {}
以及ListenableFuture管道中的异常