我正在围绕 java 库编写一个小型 scala 包装器。
java 库有一个对象 QueryExecutor 公开了 2 个方法:
- 执行(查询):结果
- asyncExecute(查询): ListenableFuture[结果]
在这种情况下,ListenableFuture 是来自 guava 库的一个。
我希望我的 scala 包装器返回 Future[Result] 而不是 java 对象,但我不确定实现它的最佳方法是什么。这是我想出的两个解决方案:
future {
executor.execute(query)
}
and
val p = promise[Result]
val guavaFuture = executor.asyncExecute(query)
Futures.addCallback(guavaFuture, new FutureCallback[Result] {
def onFailure(t: Throwable) {
p.failure(t)
}
def onSuccess(result: Result) {
p.success(result)
}
})
p.future
我想知道哪种方法最好。我的直觉是,第一个在返回 Future 时,仍然会在调用执行等待响应时阻塞线程,第二个看起来应该是真正的非阻塞。对每种方法的优缺点有何评论?
第二个选项是最好的,它使一切保持异步。但是......您可以做得更好,并将解决方案抽象为可重用的模式:
implicit class RichListenableFuture[T](lf: ListenableFuture[T]) {
def asScala: Future[T] = {
val p = Promise[T]()
Futures.addCallback(lf, new FutureCallback[T] {
def onFailure(t: Throwable): Unit = p failure t
def onSuccess(result: T): Unit = p success result
})
p.future
}
}
然后您可以简单地调用:
executor.asyncExecute(query).asScala
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)