0

x (現在は 100) ミリ秒ごとに ScheduledFuture を実行する ScheduledThreadPoolExecutor を使用しています。タスクの実行には数ミリ秒しかかかりません。

future.cancel(true) を呼び出して、それをキャンセルし、実行中の可能性のあるタスクを中断しようとすると、future は終了しますが、タスクはまだ実行されているため、プログラム エラーが発生します。私のログ出力から、最後の実行中にキャンセルが行われたようですが、キャンセルしてもスレッドは中断されず、最後まで実行できます。また、この最後の実行には、前の実行よりも数倍の時間がかかります。この動作は再現可能ですが、常に発生するとは限りません。

私の知る限り、キャンセルするとすぐにスレッドで interrupt() が呼び出され、それに応じて反応するオプションが与えられますか?? 奇妙なことに、run() の最後にしばらくスリープしてタスクの期間を人為的に延長すると、予想どおりに中断が発生します。

誰かがこの動作について説明していますか? 私が考えたタスクの期間に依存しているように見えるので、間違っている実行スケジュールを計画するためにエグゼキューターサービスに奇妙なヒューリスティックが実装されている可能性があります。問題を処理する他の(よりスマートな)方法はありますか?

4

1 に答える 1

0

私の知る限り、キャンセルするとすぐにスレッドで interrupt() が呼び出され、それに応じて反応するオプションが与えられますか?? 奇妙なことに、run() の最後にしばらくスリープしてタスクのランタイムを人為的に延長すると、予期したとおりに中断が発生します。

スレッドを中断すると、基本的にフラグが設定されます。このフラグをチェックしないか、チェックするものを呼び出さないと、これまで見てきたように何も起こりません。Thread.sleep() はチェックしますが、自分でチェックできますThread.currentThread().isInterrupted();

問題を処理する他の(よりスマートな)方法はありますか?

タスクがまだ何かを行う必要があるかどうかを確認するようにコードを記述します。これを行うために割り込みだけに頼ることはありません。ところで、サードパーティのライブラリの中には、割り込みを誤って消費したり、予期しない方法で処理したりするものがあります。

于 2013-06-07T10:10:00.190 に答える