加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

ListenableFuture到scala未来

发布时间:2020-12-16 09:47:14 所属栏目:安全 来源:网络整理
导读:我正在为一个java库编写一个小scala包装的过程。 java库有一个对象QueryExecutor公开2个方法: execute(query):结果 asyncExecute(query):ListenableFuture [Result] ListenableFuture在这个上下文是一个来自番石榴图书馆。 我想我的scala包装器返回一个Fu
我正在为一个java库编写一个小scala包装的过程。

java库有一个对象QueryExecutor公开2个方法:

> execute(query):结果
> asyncExecute(query):ListenableFuture [Result]

ListenableFuture在这个上下文是一个来自番石榴图书馆。

我想我的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

我想知道哪种方法是最好的。我的直觉是,第一个,同时返回一个未来,仍然会阻塞一个线程,而调用执行等待响应,第二个看起来应该是真正的非阻塞。对每种方法的利弊有什么评论?

解决方法

第二个选项是最好的,它保持一切异步。但是…你可以做一个更好的和抽象的解决方案成一个可重用的模式:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读