2

基本的に、次のスニペットがあります。


(let [task (FutureTask. fn)
      thr (Thread. task)]
  (.start thr)
  ;;wait for signal...
  (.cancel task true)
  (.stop thr))

問題は時々キャンセルが機能しないことです.AFAICTキャンセルが原因で例外がスローされますが、コードの一部がそれをキャッチしますか? 将来のタスクをキャンセルする確実な方法はありますか?

fn は、基本的に一連の長時間実行される計算を実行する関数であるため、ブール値フラグのチェックをループすることはできません。

4

3 に答える 3

6

Java で実行中のタスクを自動的に停止する方法はありません。一般に、実行中のスレッドを単純に「強制終了」するのは安全ではありません。その結果、この機能は意図的に Java から除外されました。

タスクをキャンセルすると、実行中のスレッドにフラグが設定されますが、例外はスローされません。タスクをキャンセルできるようにするには、スレッドが中断されたかどうかを定期的にチェックするコードを記述する必要があります。

while (notDone) {
    if (Thread.isInterrupted()){
      return; // we were cancelled (or interrupted in some other way)
    }

    doSomeHardWork()
}
于 2011-08-07T03:50:42.603 に答える
1

私の(限られた)知識によると、それを行う一般的な方法はありません。これは、中断できないリモートタスクを1つ持つことができ、純粋な機能であり、したがって殺しても安全なタスクを1つ持つことができ、多くのサブタスクを持つことができるためです(nerdytenorが述べたように-それぞれの間のisInterrupted状態を確認してください)。すべて、殺されると他のタスクをグローバルロック状態にするタスクを持つことができます...だから、私が知る限り、自分でやらなければなりません。

どのような種類の計算を実行しますか? 中で何でもできますか?グローバルでスレッドセーフなテーブル toInterrupt を作成し、タスク全体がキャンセルされようとしている場合は、各サブタスクをチェックインしますか? 私はこれが非常に非慣用的であることを知っていますが、今のところこれ以上のものは考えられません.

または、それらが本当に純粋な関数計算であり、それについて本当に確信がある場合は、プロセス/スレッドを強制終了して、あなたが正しかったことを願っています。

于 2011-08-10T14:58:27.263 に答える
0

この質問はおそらくタイムアウト付きの関数の実行に関連しています

マクロは私のコードで機能します。thunk-timeout コードはこちら

(defmacro with-timeout [time & body]
  `(thunk-timeout (fn [] ~@body) ~time))
于 2013-10-03T09:15:01.877 に答える