如何在任何时候取消异步计算?

时间:2017-02-21 10:17:47

标签: java multithreading scala concurrency akka

我必须运行复杂的异步计算,并且能够在任何时间(从计算外部)中止它们。

当前实现使用scala.concurrent.Future来运行计算。但是,在执行过程中,似乎没有一种明显的方法可以取消scala Future。

我已经找到并尝试了一些针对此问题的推荐解决方案,例如使用Promise实现cancellable Future或使用带有cancel()的java.util.concurrent.Future方法

它们都有同样的问题:执行只在到达Thread.sleep()调用时中止。

这是一个问题,原因有两个:

  1. 计算应该尽快完成。即使是非常短的睡眠时间也会适得其反。
  2. 我不是这些计算的主要开发者,我想避免对计算的实现施加任意约束。

1 个答案:

答案 0 :(得分:3)

在JVM中,你不能杀死一个线程。停止计算的唯一安全方法是中断它,这意味着设置标志/检查标志并停止逻辑。因此,为了尽可能快地停止计算,您需要尽可能频繁地检查中断的标志。在runnable / callable实现中实现它,您将获得所需的结果。