scala - Scala 中的超时 future

标签 scala concurrency future

假设我有一个函数,它调用一个阻塞可中断操作。我想在超时的情况下异步运行它。也就是说,我想在超时到期时中断该功能。

所以我正在尝试做类似的事情:

import scala.util.Try
import scala.concurrent.Future

def launch(f: () => Unit, timeout: Int): Future[Try[Unit]] = {

  val aref = new java.util.concurrent.atomic.AtomicReference[Thread]() 

  import ExecutionContext.Implicits.global
  Future {Thread.sleep(timeout); aref.get().interrupt} // 1
  Future {aref.set(Thread.currentThread); Try(f())}    // 2
}

问题是 (1) 中的 aref 可能为 null,因为 (2) 尚未将其设置为当前线程。在这种情况下,我想等到 aref 设置。最好的方法是什么?

最佳答案

您可以使用 Await 采取稍微简单的方法。 。 Await.result 方法将超时持续时间作为第二个参数,并在超时时抛出 TimeoutException

try {
  import scala.concurrent.duration._
  Await.result(aref, 10 seconds);
} catch {
    case e: TimeoutException => // whatever you want to do.
}

关于scala - Scala 中的超时 future ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16615750/

相关文章:

generics - Scala解构然后重建一个Iterable

java - 如何从线程中获取反馈? java

C++ future 调用局部变量

java - future 的取消方法文档

c++ - 在 C++ 中获取一个只有一次有效的锁

c++ - 查看 std::future 是否已经启动

scala - 哪个 Scala 函数来替换这个过程语句?

scala - 验证 Datomic 实体 ID 是否有效

scala - 如何制作一个右关联的中缀运算符?

python - 使用 pytest 同时运行 celery 任务