14

InterruptedException の機能とスローされる理由を理解しています。しかし、私のアプリケーションでは、アプリケーションSwingUtilities.invokeAndWait()だけが知っているスレッドを待っているときにそれを取得し、アプリケーションがスレッドを呼び出すことはThread.interrupt()なく、スレッドの参照を誰にも渡すことはありません。

だから私の質問は: 誰が私のスレッドを中断しますか?

伝える方法はありますか?InterruptedException に、割り込みを要求するスレッドの名前が含まれていない理由はありますか?

これを行うフレームワークまたはライブラリである可能性があることを読みました。次を使用しますが、スレッドを中断する理由が思いつきません。

  • 休止状態
  • Log4J
  • Mysql コネクタ
4

3 に答える 3

12

可能であれば、このスレッドThreadのメソッドを拡張および上書きしてinterrupt()、スタック トレースを出力するか、サポートされていない操作の例外をスローすることができます。

拡張Threadクラスを使用して、割り込みスレッドへの参照を保存し、割り込み例外をキャッチしたらそれを読み取ることもできます。

于 2010-03-19T12:16:51.240 に答える
4

一般に、誰が何かを行っているかを知りたい場合は、デバッガーをアタッチし、ブレークポイントを配置すれば完了です。再現できるかどうか推測する必要はありません。

この場合、ブレークポイントを に置くことができますThread.interrupt()。中断されている他のスレッドがある場合 (つまり、ブレークポイントに「誤検知」ヒットがある場合)、たとえばスレッドの名前を確認することにより、ブレークポイント条件を追加できます (ほとんどの IDE では簡単に実行できます)。 .

于 2010-03-19T09:47:42.473 に答える
2

ここで奇妙なことがあります。

invokeAndWaitの javadoc から、InterruptedExceptionがスローされます

イベントディスパッチスレッドが doRun.run() の実行を終了するのを待っている間に中断された場合

EDT で実行されたコードが例外を送信するかどうかを確認しようとしましたか? または、EDT でこのスレッドの変数の一部を変更しようとするコードを実行します (この用語は Java 言語では「オーソドックス」ではないことはわかっていますが、私の意味を理解していただければ幸いです: 同期、待機、結合などを意味するコードはすべて...

于 2010-03-19T09:14:47.720 に答える