2017-02-21 70 views
0

我必須運行復雜的異步計算,並能夠在任何時候(從計算外部)中止它們。如何隨時取消異步計算?

當前實現使用scala.concurrent.Future來運行計算。但是,在執行過程中似乎沒有明顯的方式取消scala Future。

我發現並嘗試了一些對此問題的推薦解決方案,例如使用Promise實施cancellable Future或使用具有cancel()方法的java.util.concurrent.Future。

所有這些問題都有同樣的問題:執行只在到達Thread.sleep()調用時中止。

這是有兩個原因的一個問題:

  1. 的計算應​​以最快的速度完成越好。即使很短的睡眠時間也會適得其反。
  2. 我不是這些計算的主要開發人員,我想避免對計算的實現施加任意約束。
+0

「執行僅當它到達Thread.sleep()」時纔會中止。這不是真的。只要達到檢查線程中斷狀態的適當代碼,它就會中止。 – Kayaman

+0

這聽起來像是你的計算太大了,如果你不得不擔心中間流的中斷。你不會說你有什麼樣的工作量,並且它很容易並行。 –

+0

@ChrisMowforth你的意思是「中流」中斷是什麼意思?我沒有詳細介紹工作負載,因爲它可能幾乎是從簡單的wordcount到複雜的視頻過濾器或模擬。我爲這些計算提供了一個運行環境,如果需要,我必須能夠殺死它們。這些計算由第三方執行。 – DrummerB

回答

3

在JVM中,您不能殺死一個線程。停止計算的唯一安全方法是中斷它,這意味着設置標誌/檢查標誌和停止邏輯。因此,要儘可能快地停止計算,您需要儘可能頻繁地檢查中斷標誌。在你的runnable/callable實現中實現它,你將得到期望的結果。