6

これは、独自のスレッドを作成していたときの古い Java に関する質問です。別のスレッドによって中断されたときにThread.sleep(100)スローするようないくつかのメソッド。InterruptedException私が理解しているように、中断とは、別のスレッドが言っていることを意味します。

これが起こったとき、なぜ Java は私たちに対処することを望んでいるのInterruptedExceptionでしょうか?

プログラマーは、スレッドがいつ相互に割り込んでいるかを気にする必要さえありません。彼は作業をスレッド間で分割し、それが完了したときに通知を受けることができるはずです。では、Java が私たちに対処を求めている理由は何InteruptedExceptionでしょうか? 少なくともそうあるべきだRuntimeException

4

4 に答える 4

7

プログラマーは、スレッドがいつ相互に割り込んでいるかを気にする必要さえありません。

本当じゃない。中断が要求されたことを知りたい状況は非常に多くありますが、実行中の仕事を完了するために少しの間それを無視します。

たとえば、あるスレッドがファイルを開き、データの書き込みを開始するとします。次に、このスレッドはブロックされ、残りのデータが計算されるのを待ちます。2 番目のスレッドが最初のスレッドに割り込もうとしたとします。それは何をすべきですか?単純に死ぬと、破損した不完全なファイルになってしまうのでしょうか? 書き込みを開始したファイルを削除してクリーンアップする必要がありますか? 割り込み要求を無視して、書き込む必要のあるデータが終了するのを待つ必要がありますか? 次回はその時点から作業を続行できるように、「ここで中断されました」という意味を書く必要がありますか?

別のシナリオで、HTTP サーバーがあるとします。ユーザーがサーバーにアクセスし、そこから大きなファイルをダウンロードしているとします。サーバーを停止したい。その後、アプリケーションはすべてのワーカー スレッドを中断しようとします。彼らは何をすべきですか?ダウンロードを停止するだけですか?それとも、ユーザーがファイルのダウンロードを完了するのを待ってから、それ以上の要求を受け入れずに終了する必要がありますか? どちらのシナリオも等しく有効です。

ご覧のとおり、考えられるシナリオが多すぎて、中断が要求されたことを知る方法がなかったら大変なことになります。場合によっては、単にスレッドを停止させます。場合によっては、環境をクリーンアップする必要があります。処理中のリクエストを終了させたいが、それ以上のリクエストを受け付けないようにしたい場合があります。

于 2013-04-08T03:57:15.297 に答える
1

RuntimeExceptions は、プログラミング エラーを表すと想定されています ( http://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.htmlを参照)。InterruptedException は、別のスレッドからのシグナルに似ています。

于 2013-04-08T04:22:26.267 に答える
0

スレッドが強制的に中断されると、 anInteruptedExceptionがスローされます。これは通常の状況ではありません (つまり、スレッドがスケジューラによってコンテキストが切り替えられた場合)。例としては、別のスレッドが手動で中断した場合や、プロセスがSIGINTシグナルを受信した場合です。

于 2013-04-08T04:00:28.757 に答える