4

私はついに Thread.stop() の代わりに Thread.interrupt() をプログラムに実装することができました。しかし、私がこれをうまくやったかどうかはわかりません。

Thread を拡張し、いくつかのメソッドを宣言するクラスがあります。すべてのメソッドは InterruptedException をスローするように作成されています (各メソッドは I/O 集中型の操作を実行し、その一部は完了するまでに数分かかります。したがって、操作が完了するまでフラグがチェックされないため、スレッドセーフ フラグは使用していません) . また、例外をスローするために、これらのメソッド内のいくつかの場所に次のコードを追加しました。

if (this.isInterrupted()) throw new InterruptedException();

run() メソッド内で、InterruptedException の try/catch 内ですべてのメソッドを実行します。キャッチされた場合は、クラス変数に対して Process.destroy() と BufferedReader.close() を実行します。

これはすべて機能し、非常にうまく機能しているようですが、いくつか質問があります。

  1. 10 個を超えるメソッドがあり、そのすべてが InterruptedException をスローするのは正しいですか? これを行うより良い方法はありますか?
  2. isInterrupted() のチェックでメソッドを膨らませるのは正しいですか?
  3. catch InterruptedException ブロックの最後で、スレッドを GC で使用できるようにするために、特定の値の「リターン」または「ヌル」を実行する必要がありますか? スレッドを再作成すると、初期化に通常より時間がかかります。
  4. 最後に、私が行ったことに関連する問題/機能強化はありますか?

よろしくお願いします。

4

1 に答える 1

3

Javaでのスレッドの中断は、そのスレッドの実行を停止することを意味するものではありません。止まらず、割り込みです。スレッドは、基本的かつ重要な何かが変更されたときに中断される可能性があり、実行コンテキスト、タスク、または環境が何らかの重要な方法で変更されたことをスレッドに通知します。このメッセージに対するスレッドの反応は、実装固有です。停止することも、再起動することも、その他のアクションを実行することもできます。中断を処理しないスレッドは中断できませんが、共有変数を使用するなどして、その動作を変更することはできます。

たとえば、多数のスレッドがあり、すべてが問題空間の一部を検索して解決策を探しているとします。あるスレッドが解決策を見つけると、他のスレッドが解決策を探すことができなくなるため、他のスレッドに割り込む可能性があります。解決策はすでに見つかっています。

または、1つの継続的に動作するメインスレッドと1つのネットワーク通信スレッドを想像してみてください。ネットワークスレッドがメッセージを受信するたびに、メッセージで作業スレッドを中断します。メッセージとコンテキストに基づいて、ワーカースレッドは次に何をするかを決定できます。たとえば、メッセージが「STOP」の場合、すべての実行をすぐに停止できます。メッセージが「RESET」の場合、実行コンテキストに基づいて、最初からやり直すことも、最初からやり直して、以前の作業を再利用することもできます。

10を超えるメソッドがあり、そのすべてがスローされるのは正しい InterruptedExceptionですか?これを行うためのより良い方法はありますか?

いいえ、何をしているのかを知っている限り、これはまったく問題ありません。スレッドを停止するためだけに割り込みを実装する場合は、InterruptedExceptionsをスローする必要はありません。スレッドのrun()メソッドが最初であり、例外はそれ以上スタックに進みません。

isInterrupted()のチェックでメソッドを肥大化させるのは正しいですか?

状況に応じて。チェックは通常、いくつかの重要なコードの前に追加されます。通常、ループブロックの最初のアイテムとして追加されます。

catch InterruptedExceptionブロックの最後で、スレッドをGCで使用できるようにするために、「return」または「null」の特定の値を実行する必要がありますか?スレッドを再作成すると、初期化に通常より時間がかかります。

いいえ。run()メソッドからスレッドが存在すると、GCに翻弄されます。共有変数は、他のオブジェクトによって参照されている限り、GCされません。

于 2012-12-08T01:36:09.507 に答える