5

サーバーアプリケーションのある時点で、I/Oブロッキング操作を実行しているいくつかのスレッドを停止したいと思います。

たとえば、そのうちの1つには次のrun()方法があります。

public void run() {
    System.out.println("GWsocket thread running");

    int len;
    byte [] buffer = new byte[1500];
    try {
        this.in  = new DataInputStream(this.socket.getInputStream());
        this.out = new DataOutputStream(this.socket.getOutputStream());
        running = true;

        while (running){
            len = in.read (buffer);
            if (len < 0)
                running = false;
            else
                parsepacket (buffer, len);
        }

    }catch (IOException ex) {
        System.out.println("GWsocket catch IOException: "+ex);
    }finally{
        try {
            System.out.println("Closing GWsocket");
            fireSocketClosure();
            in.close();
            out.close();
            socket.close();
        }catch (IOException ex) {
            System.out.println("GWsocket finally IOException: "+ex);
        }
    }
}

このコードを実行しているスレッドを停止したい場合は、どうすればよいですか?

ここでは、その方法を示しています(たとえば、入力を長時間待機するスレッドを停止するにはどうすればよいですか?)が、その意味がわかりません。

この手法を機能させるには、割り込み例外をキャッチし、それを処理する準備ができていないメソッドが、すぐに例外を再度アサートすることが重要です。例外を再スローすることが常に可能であるとは限らないため、再スローではなく再アサートと言います。InterruptedExceptionをキャッチするメソッドが、この(チェックされた)例外をスローするように宣言されていない場合は、次の呪文で「それ自体を再中断」する必要があります。Thread.currentThread()。interrupt();

誰かが私にいくつかのヒントを与えることができますか?いくつかのコード例をいただければ幸いです。

4

2 に答える 2

6

次のようなメソッドを追加できます

public void close() throws IOException {
    this.socket.close();
}

また、IO操作をブロックするとSocketExceptionがスローされます。

closedスローされた例外が予期されたかどうかを確認できるようなフラグを設定することをお勧めします。

ところで:読み取り時に個別のパケットを取得するかどうかはわかりません。必要なものを読み、効率を上げるためにBufferedInputStreamを使用することをお勧めします。ソケットからファイルへのコピーなど、内容を解析する必要がない場合にのみブロックを読み取ります。

たとえば、読み取りで1バイトだけを取得することも、1つのパケットの終わりと別のパケットの開始を取得することもできます。

于 2012-09-07T09:17:37.587 に答える
6

Peter Lawreyによって説明され、ここでも見られる解決策は、ソケットを閉じることです。

nioを使用すると、割り込み可能で、Javaの標準割り込みモデルの適用を可能にするSocketChannelを使用することもできます。

Threadオブジェクトのinterruptメソッドを呼び出すと、InterruptedExceptionがスローされ、ブロッキングIO操作も停止します。

于 2012-09-07T09:30:09.663 に答える