计算有时间限制

par*_*tic 8 java timeout scala

我正在尝试编写一个允许我在给定时间窗口中运行计算的构造.就像是:

def expensiveComputation(): Double = //... some intensive math

val result: Option[Double] = timeLimited( 45 ) { expensiveComputation() }
Run Code Online (Sandbox Code Playgroud)

timeLimited将以expensiveComputation45分钟的超时运行.如果它达到超时它返回None,否则它将结果包装进去Some.

我正在寻找一个解决方案:

  • 在性能和记忆方面相当便宜;
  • 将在当前线程中运行限时任务.

有什么建议吗?

编辑

我理解我的原始问题没有解决方案.假设我可以为计算创建一个线程(但我更喜欢不使用线程池/执行器/调度程序).什么是最快,最安全,最干净的方法?

gru*_*ewa 8

运行给定的代码块或在超时时抛出异常:

@throws(classOf[java.util.concurrent.TimeoutException])
def timedRun[F](timeout: Long)(f: => F): F = {

  import java.util.concurrent.{Callable, FutureTask, TimeUnit}

  val task = new FutureTask(new Callable[F]() {
    def call() = f
  })

  new Thread(task).start() 

  task.get(timeout, TimeUnit.MILLISECONDS)
}
Run Code Online (Sandbox Code Playgroud)