0

ソケットで受信メッセージをリッスンするためにスレッドが使用されているという奇妙な問題が発生しています。スレッドはグローバルに宣言されますが、メソッド listen() 内でインスタンス化されます。これにより、最初は完全に機能する別のメソッド stopListen() から中断できますが、listen() と stopListen() が 2 回目に呼び出されると、中断されないように見えます。「Do some stuff」とコメントされたコードは、着信メッセージを 2 回待った後も実行されます。以下は、コードの短縮バージョンです。

public class Con {
    private Thread listen;

    public void listen() {
        listen = new Thread(new Runnable() {
            @Override
            public void run() {
                while (!Thread.interrupted()) {
                    //Wait for an incoming message
                    if (!Thread.interrupted()){
                        //Do some stuff
                    }
                }
            }
        });
        listen.start();
    }

    public void stopListen() {
        listen.interrupt();
    }
}

同じものと呼ばれる変数とメソッドを持つのは少し奇妙です。これは機能するはずですか、それともグローバル変数を複数回使用してスレッドを中断できませんか?

ありがとう。

4

1 に答える 1

5

私が見る主な問題はinterrupted()、割り込みフラグをリセットすることです(リンクされたドキュメントを参照)。つまり、次の呼び出しは、interrupted()再度中断されない限りfalseを返します。代わりにisInterrupted()、フラグをクリアしない which を使用してください!

また、chr が言ったように、複数のスレッドを開始する (listen()複数回呼び出す) と、最新のスレッドにしか割り込みできなくなります。その場合、Listスレッドを作成してすべてを中断します (または、リストの最初のスレッドのみをリストから削除するか、必要な機能をすべて削除します)。

于 2013-04-18T23:59:54.873 に答える