当前位置: 首页 > 知识库问答 >
问题:

可听未来到斯卡拉未来

吕扬
2023-03-14

我正在围绕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

我想知道哪种方法是最好的。我的直觉是,第一个函数在返回一个未来值时,仍然会阻塞一个线程,而executehtml" target="_blank">调用等待响应,第二个函数看起来应该是真正无阻塞的。对每种方法的利弊有何评论?

共有2个答案

卜方伟
2023-03-14

另一个略短的解决方案:

implicit class ListenableFutureDecorator[T](val f: ListenableFuture[T]) extends AnyVal {
  def asScala(implicit e: Executor): Future[T] = {
    val p = Promise[T]()
    f.addListener(() => p.complete(Try(f.get())), e)
    p.future
  }
}
龚招
2023-03-14

第二个选项是最好的,它使一切保持异步。但是…您可以做得更好,并将解决方案抽象为可重用模式:

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
 类似资料:
  • 基本上,我在cassandra上运行两个期货查询,然后我需要做一些计算并返回值(值的平均值)。 这是我的代码: 那么问题出在哪里呢? skus.foreach 在 ListBuffer 中追加结果值。由于一切都是异步的,当我尝试在我的主数据库中获取结果时,我得到了一个错误,说我不能被零除。 事实上,由于我的Sku.findSkusByProduct返回一个Future,当我尝试计算平均值时,卷是空

  • 我在Java寻找与斯卡拉的未来相当的东西。 我正在寻找一种构造类型,它允许我将任务(s/s)提交到我选择的特定线程池,返回futures,允许我在任务完成时将一些逻辑(以非阻塞方式)链接到它。大概是这样的: Java的线程池(通过singleton提供)似乎总是返回标准的Javas,它只允许我调用阻塞。另一方面,据我所知,,更类似于Scala的promise,并且不绑定到线程池。 Java提供我想

  • 问题内容: 我尽力而为,但没有找到任何文章和博客可以清楚地比较和,并且提供了很好的分析。 因此,如果任何人都可以向我解释或指向这样的博客或文章,那对我来说真的非常好。 问题答案: 无论 ListenableFuture 和 CompletableFuture 有超过它的父类的优势 未来 通过允许呼叫者在这样或那样的回调“注册”当异步动作已经完成被调用。 使用 Future, 您可以执行以下操作:

  • 请看下面的代码,让我知道我哪里做错了? 使用: DSE版本-5.1.0 172.31.16.45:9042连接到测试群集。[cqlsh 5.0.1|Cassandra3.10.0.1652|DSE 5.1.0|CQL规范3.4.4|本地协议v4]使用HELP寻求帮助。 谢谢 斯卡拉 斯卡拉 斯卡拉 我在这里什么都得不到?甚至没有错误。

  • 假设我有一个并行度为n的ForkJoinPool设置,我称之为这样的并行计算: 我这样做是为了确保生成的线程是在工作池中创建的(我有需要隔离的系统的不同组件)。现在假设调用它的线程也在这个工作池中执行,我会: 1) 我是不是挡住了泳池里的一根线?如果我让n个线程都阻塞未来,同时尝试在工作池中安排任务,这会导致死锁吗?我不清楚ForkJoinPool中的“最大并行度”是否意味着(如果有n个未阻塞的任

  • 我在eclipse中将scala项目转换为使用Maven(只需右键单击project并配置Maven build),这就创建了pom。xml,添加了正确的依赖项,它从maven存储库中提取了所需的JAR,但每当我尝试编译时,我都看不到在target\classes文件夹中生成类文件。然而,我在target\classes文件夹下的相应目录中看到了scala文件的实际源代码。我不确定它为什么要复制t