在Scala中使用超时的未来 [英] Future with Timeout in Scala

查看:0
本文介绍了在Scala中使用超时的未来的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

所以我正在尝试这样做:

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可以为空,因为(2)尚未将其设置为当前线程。在这种情况下,我想等待aref被设置。执行此操作的最佳方式是什么?

推荐答案

如果添加CountDownLatch,就可以实现您想要的行为。(请注意,在大量的Future中阻塞(即被困在await)可能会导致线程池耗尽。)

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
}

这篇关于在Scala中使用超时的未来的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆