gpt4 book ai didi

java - java.util.concurrent.Future 的 scala.concurrent.Future 包装器

转载 作者:IT老高 更新时间:2023-10-28 20:46:41 31 4
gpt4 key购买 nike

我将 Play Framework 2.1.1 与一个生成 java.util.concurrent.Future 结果的外部 java 库一起使用。我使用的是 scala future 而不是 Akka,我认为从 Play 2.1 开始这是正确的做法。如何将 java.util.concurrent.Future 包装到 scala.concurrent.Future 中,同时保持代码非阻塞?

def geConnection() : Connection = {
// blocking with get
connectionPool.getConnectionAsync().get(30000, TimeUnit.MILLISECONDS)
}

上面的代码返回一个连接,但是使用了一个get,所以它变成了阻塞

def getConnectionFuture() : Future[Connection] = {
future {
// how to remove blocking get and return a scala future?
connectionPool.getConnectionAsync().get(30000, TimeUnit.MILLISECONDS)
}
}

理想情况下,我想要一个 scala 函数,它可以像上面的代码一样将连接作为 future 返回,但不会通过 get 阻塞代码。我还需要在函数中添加什么以使其非阻塞。

任何指针都会很棒。

最佳答案

import java.util.concurrent.{Future => JFuture}
import scala.concurrent.{Future => SFuture}

你不能换行 JFutureSFuture没有阻塞,因为 SFuture (onComplete) 中有回调,并且 JFuture 中只有阻塞 get

你所能做的就是创建额外的线程并用get阻塞它,然后完成Promise get 的结果。

val jfuture: JFuture[T] = ???
val promise = Promise[T]()
new Thread(new Runnable { def run() { promise.complete(Try{ jfuture.get }) }}).start
val future = promise.future

你可以在无限循环中检查 isDone,但我不认为它比阻塞更好。

关于java - java.util.concurrent.Future 的 scala.concurrent.Future 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17215421/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com