それclientSocket
があなたの唯一の外部から見える参照であるように見えます。別のスレッドから、clientSocket.close()
これにより、はreadObject()呼び出しでIOExceptionObjectInputStream
をスローします。これにより、catchブロックがトリガーされ、ループから抜け出すことができます。
readObject
質問を読み直すと、 InterruptedExceptionはスローされないと言います。あなたはその点で正しいです:私はreadObject
今のところソースを見ています、そしてそれthrows
は明示的にを隠していませんInterruptedException
。
別のスレッド(または読み取りスレッドに名前を付けたものcatch (Exception ex)
)から呼び出すことで、常にその最後のブロック(別名例外イーター)をトリガーできるはずです。JavadocobjectReadingThread.interrupt()
の引用:
Objectクラスのwait()、wait(long)、wait(long、int)メソッド、またはjoin()、join(long)、join(long、int)の呼び出しでこのスレッドがブロックされた場合、sleep(long)、またはsleep(long、int)、このクラスのメソッドの場合、その割り込みステータスはクリアされ、InterruptedExceptionを受け取ります。
このスレッドが割り込み可能なチャネルでのI/O操作でブロックされた場合、チャネルは閉じられ、スレッドの割り込みステータスが設定され、スレッドはClosedByInterruptExceptionを受け取ります。
このスレッドがセレクターでブロックされている場合、スレッドの割り込みステータスが設定され、セレクターのウェイクアップメソッドが呼び出されたかのように、おそらくゼロ以外の値で、選択操作からすぐに戻ります。
上記の条件のいずれも当てはまらない場合、このスレッドの割り込みステータスが設定されます。
それが機能しない場合は、「オブジェクトで何かを行う」ブロックを調査し、割り込みを消費して無視している例外を食べる人を見つけようとします。