我正在围绕 java 库编写一个小型 scala 包装器。
Java 库有一个对象 QueryExecutor 公开 2 个方法:
- 执行(查询):结果
- asyncExecute(查询):ListenableFuture [结果]
在这种情况下,ListenableFuture 是来自 guava 库的。
我希望我的 scala 包装器返回 Future[Result] 而不是 java 对象,但我不确定实现它的最佳方法是什么。这是我想出的2个解决方案:
future {
executor.execute(query)
}
和
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 时仍然会阻塞一个线程,而执行调用等待响应,第二个看起来应该是非阻塞的。对每种方法的优缺点有何评论?