3

ObjectInputStreamからオブジェクトを配置して読み取るスレッドがあります。

public void run() {
    try {
        ois = new ObjectInputStream(clientSocket.getInputStream());

        Object o;
        while ((o = ois.readObject()) != null) {
            //do something with object
        }
    } catch (Exception ex) {
        //Log exception
    }
}

readObjectはInterruptedExceptionをスローしません。私が知る限り、このスレッドが中断されても例外はスローされません。このスレッドを停止するにはどうすればよいですか?

4

3 に答える 3

4

closeソケット入力ストリームで呼び出します。別のスレッドからそれを行うことができるはずです。

于 2010-06-15T16:20:19.970 に答える
2

それ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を受け取ります。

このスレッドがセレクターでブロックされている場合、スレッドの割り込みステータスが設定され、セレクターのウェイクアップメソッドが呼び出されたかのように、おそらくゼロ以外の値で、選択操作からすぐに戻ります。

上記の条件のいずれも当てはまらない場合、このスレッドの割り込みステータスが設定されます。

それが機能しない場合は、「オブジェクトで何かを行う」ブロックを調査し、割り込みを消費して無視している例外を食べる人を見つけようとします。

于 2010-06-16T12:35:18.317 に答える
0

InterruptedIOExceptionをキャッチしようとすることができます。あなたの特定のケースで役立つかどうかはわかりませんが、そのようなケースに対処する最も明確な Java の方法です。

魔法の方法で IOException をキャッチしたにもかかわらず EOFException がキャッチされないという驚くべきケースを扱っているので、あなたの答えも興味深いものでした。別のケースでは、予期しない InterruptException へのリンクではないにもかかわらず、InterruptException が発生します。これらのケースには、I/O 操作に近い例外処理に関する共通の問題があります。

于 2012-05-29T10:06:03.750 に答える