首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Scala中超时问题

Scala中超时问题
EN

Stack Overflow用户
提问于 2018-05-10 01:32:13
回答 2查看 0关注 0票数 0

假设我有一个调用阻塞的可中断操作的函数。我想以超时的方式异步运行它。也就是说,我想在超时过期时中断函数。

所以我试图做这样的事情:

代码语言:javascript
复制
导入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(超时); aref.get()。interrupt} // 1
  未来{aref.set(Thread.currentThread); 试试(f())} // 2
}

问题是aref(1)中可以为null,因为(2)尚未将它设置为当前线程。在这种情况下,我想等待aref设置。最好的方式来做到这一点是什么?

EN

回答 2

Stack Overflow用户

发布于 2018-05-10 09:58:51

如果你添加了CountDownLatch,你可以实现你想要的行为

代码语言:txt
复制
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]()
  val cdl = new java.util.concurrent.CountDownLatch(1)

  import ExecutionContext.Implicits.global
  Future {Thread.sleep(timeout); cdl.await(); aref.get().interrupt}   // 1
  Future {aref.set(Thread.currentThread); cdl.countDown(); Try(f())}  // 2
}
票数 0
EN

Stack Overflow用户

发布于 2018-05-10 11:00:08

可以使用Await稍微简单一些。该Await.result方法将超时持续时间作为第二个参数并引发TimeoutException超时。

代码语言:javascript
复制
try {
  import scala.concurrent.duration._
  Await.result(aref, 10 seconds);
} catch {
    case e: TimeoutException => // whatever you want to do.
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100008440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档