【发布时间】:2011-11-30 20:46:42
【问题描述】:
我正在尝试编写一个允许我在给定时间窗口中运行计算的构造。比如:
def expensiveComputation(): Double = //... some intensive math
val result: Option[Double] = timeLimited( 45 ) { expensiveComputation() }
这里timeLimited 将运行expensiveComputation,超时时间为45 分钟。如果达到超时,则返回None,否则将结果包装到Some。
我正在寻找以下解决方案:
- 在性能和内存方面相当便宜;
将在当前线程中运行限时任务。
有什么建议吗?
编辑
我了解我最初的问题没有解决方案。假设我可以为计算创建一个线程(但我不喜欢使用线程池/执行器/调度程序)。最快、最安全、最干净的方法是什么?
【问题讨论】:
-
是否可以检查
expensiveComputation()中的变量或在while(doIHaveTimeLef())...之类的循环中运行昂贵的计算? -
理想情况下不会。我更喜欢通用解决方案...
-
@Jamil 当然这是一个“停止问题”。但不是经典版,不是吗?您的视野有限,因此问题变得可以确定。
-
Thread.stop()的问题是它可能会使以前锁定的对象处于不一致的状态,对其他线程可见。只要您完全丢弃超时线程可能修改的任何内容,stop()对您来说可能没问题。但是,如果您想从计算中获得一些复杂的结果,这可能并不容易实现。 -
请注意,接受的解决方案不会停止正在运行的线程。事实上,这样做的 Java 方法已被弃用——有关更多信息,请参阅this。 Effective Java 中推荐的方法是有一个布尔标志来指示这是否已经超时,并在计算中定期检查它。