假设我有一个调用阻塞的可中断操作的函数。我想以超时的方式异步运行它。也就是说,我想在超时过期时中断函数。
所以我试图做这样的事情:
导入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
设置。最好的方式来做到这一点是什么?
发布于 2018-05-10 09:58:51
如果你添加了CountDownLatch,
你可以实现你想要的行为
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
}
发布于 2018-05-10 11:00:08
可以使用Await稍微简单一些。该Await.result
方法将超时持续时间作为第二个参数并引发TimeoutException
超时。
try {
import scala.concurrent.duration._
Await.result(aref, 10 seconds);
} catch {
case e: TimeoutException => // whatever you want to do.
}
https://stackoverflow.com/questions/-100008440
复制相似问题