2011-04-28 11 views

答えて

0

これは実際には非常にトリッキーなレースコンディションだった

を解決しました。私はGUIスレッドからタスクを開始し、ネットワークリーダーのスレッドからキャンセルしています。私はlog4jがロガーを表示しなかった理由を説明することはできませんが、より良いスレッド制御が私の問題を解決しました。あなたの答えは、それを解決するためのアイディアを追跡するのに役立ちました。ありがとうございました。

昨日は動作していましたが、今日は動作しませんでした。おそらく競合状態またはデッドロックです。 :-)

1

私の推測では、doSomethingのかのdoSomethingによって消費された割り込みは、あなたがより適しだろう制御フローを持っているように私には、このようなループ内でwait()を使用することをお勧め

(戻らない)縛られたということです並行性ライブラリの使用に至りました。あなたは何を待っているかについていくつか詳しく説明できますか?

ところで、try/cathをループの外側に移動すると、単純化されます。

+0

私は進行状況バーを更新する前に(SwingUtilities.invokeLater')いくつかの計算をしています。それから私は100%を設定するか、ユーザークリックをキャンセルするまで、400ms待ってからやり直します。 doSomething()は例外をキャッチしていません。 – teodozjan

+0

interrupt()を呼び出した後、スレッド上でgetStackTrace()を呼び出して、それが何をしているのかを確認できますか? –

0

まず、スニペットはコンパイルされません。中括弧が欠けています。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を移動させながらは間違いなく良い提案です!

+0

私は空腹時に書いていました...申し訳ありません。私は自分の投稿を編集しました。 いいえ、私は 'Thread.interrupted()'を呼び出すつもりはありません。 – teodozjan

+0

runメソッドの最後にメッセージを出力します。中断しようとしている間にまだ実行中ですか? –

+0

新しく提出されたタスクは実行されますが、戻ってこないように見えます( 'while'ループを残した後はロガーを表示せず、' someCondition'でもロガーを表示しています)。 – teodozjan

関連する問題