【发布时间】:2013-05-13 00:25:33
【问题描述】:
假设我有一个函数,它调用一个阻塞interruptible 操作。我想在超时的情况下异步运行它。也就是说,我想在超时到期时中断该功能。
所以我正在尝试做这样的事情:
导入 scala.util.Try 导入 scala.concurrent.Future def launch(f: () => Unit, timeout: Int): Future[Try[Unit]] = { val aref = new java.util.concurrent.atomic.AtomicReference[Thread]() 导入 ExecutionContext.Implicits.global 未来 {Thread.sleep(timeout); aref.get().interrupt} // 1 未来 {aref.set(Thread.currentThread);尝试(f())} // 2 }问题是 (1) 中的aref 可以为 null,因为 (2) 尚未将其设置为当前线程。在这种情况下,我想等到设置aref。最好的方法是什么?
【问题讨论】:
-
我假设是这样,但是有没有理由不在一个线程中执行
set,然后仅在设置后才拆分两个期货? -
Future[Unit]已经为您提供了Try值,无需嵌套额外的Try。 -
@0__:同意,但出于某种奇怪的原因,在 M. Odersky 和 Erik Meijer 在 Coursera 上的功能响应式编程课程中,在其中一个讲座视频中,Meijer 使他的示例函数之一“更健壮” " 通过使其返回
Future[Try[T]]而不是Future[T]。 -
@0__ 谢谢,我就是这么想的。
-
@ErikAllik 你知道我们会看到不同的任何例子吗? /你能详细说明一下吗?我试图看到一些不同的行为设置超时并除以零,但我做不到。我在
Await处添加了一个Try(我认为通过捕获超时异常确实会有所不同)。
标签: scala concurrency future