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):结果 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |