でタスクを実行しているキャンセルします。インポッシブル私はクラスのRunnableを実装しているSingleThreadExecutor
futureTask.cancel(true);
今日、私のRunnable
オブジェクトが割り込みを受け付けなくなりました。 私は割り込み状態をログアウトしました:偽です。 InterruptedException
はスローされません。何が間違っている?
でタスクを実行しているキャンセルします。インポッシブル私はクラスのRunnableを実装しているSingleThreadExecutor
futureTask.cancel(true);
今日、私のRunnable
オブジェクトが割り込みを受け付けなくなりました。 私は割り込み状態をログアウトしました:偽です。 InterruptedException
はスローされません。何が間違っている?
これは実際には非常にトリッキーなレースコンディションだった
を解決しました。私はGUIスレッドからタスクを開始し、ネットワークリーダーのスレッドからキャンセルしています。私はlog4jがロガーを表示しなかった理由を説明することはできませんが、より良いスレッド制御が私の問題を解決しました。あなたの答えは、それを解決するためのアイディアを追跡するのに役立ちました。ありがとうございました。
昨日は動作していましたが、今日は動作しませんでした。おそらく競合状態またはデッドロックです。 :-)
私の推測では、doSomethingのかのdoSomethingによって消費された割り込みは、あなたがより適しだろう制御フローを持っているように私には、このようなループ内でwait()を使用することをお勧め
(戻らない)縛られたということです並行性ライブラリの使用に至りました。あなたは何を待っているかについていくつか詳しく説明できますか?
ところで、try/cathをループの外側に移動すると、単純化されます。
まず、スニペットはコンパイルされません。中括弧が欠けています。Thread.currentThreadは、インスタンス変数ではないメソッドです。それからdoSomethingメソッドでThread.interrupted()を呼び出していますか? yesの場合、スレッドの中断された状態をクリアするので、waitは中断されず、currentThread()。isInterrupted()はfalseを返します。
while句で中断した状態を再確認する必要はなく、繰り返し発生したスレッドを再割り込みする必要もありません。これは、よりよいに見える(とあなたのdoSomethingのは投げるかもしれないという例外をキャッチ):
public synchronized void run() {
try {
while (!someCondition()) {
doSomething();
wait(SOME_TIME);
}
} catch (InterruptedException ie) {
logger.error(ie);
} catch (Exception e) {
logger.error(e);
}
}
@Peter:周りのtry/catchを移動させながらは間違いなく良い提案です!
私は進行状況バーを更新する前に(SwingUtilities.invokeLater')いくつかの計算をしています。それから私は100%を設定するか、ユーザークリックをキャンセルするまで、400ms待ってからやり直します。 doSomething()は例外をキャッチしていません。 – teodozjan
interrupt()を呼び出した後、スレッド上でgetStackTrace()を呼び出して、それが何をしているのかを確認できますか? –