5

次のコードブロックがあります。

public void startListening() throws Exception {
    serverSocket = new DatagramSocket(port);
    new Thread() {

        @Override
        public void run() {
            System.out.print("Started Listening");
            byte[] receiveData = new byte[1024];
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            while (!stopFlag) {
                try {
                    serverSocket.receive(receivePacket);
                    String message = new String(receivePacket.getData());
                    System.out.println("RECEIVED: " + message);
                } catch (Exception ex) {
                    System.out.print("Execption :" + ex.getMessage());
                }
            }
        }
    }.start();
}


public void stopListening() {
    this.stopFlag = true;
}

stopFlagをtrueに設定したとします。serverSocket.receive(receivePacket);パケットを受信するまで待機します。stopFlagがtrueに設定されたらすぐにスレッドを終了させたい場合は、どうすればよいですか。

4

4 に答える 4

6

ソケットでも同じ問題が発生し、interrupt()が機能しませんでした。私の問題は、ソケットを閉じることで解決しました。したがって、setStop()メソッド(上記で提案したように)では、呼び出す必要がありますserverSocket.close()(明らかに、serverSocketをクラスメンバーなどにする必要があります)。

于 2012-04-13T07:20:57.707 に答える
2

を変更する予定のコードを含むコードがあると便利ですstopFlag。スレッドの外側にある場合は、おそらくスレッド上でaを使用.interrupt()し、その後にスレッド上でaを使用でき.destroy()ます。サーバーソケットにタイムアウトを追加しようとするのは、おそらく理想的な解決策ではありません。JavaAPIのsetSoTimeout()メソッドを参照してください。DatagramSocket

于 2012-04-13T07:16:37.327 に答える
2

停止フラグがどこから来ているのかわかりませんが、とにかく、答えは割り込みです。

Thread t;
ServerSoket serverSoket;

public void startListening() throws Exception {
    ...
    serverSocket = new DatagramSocket(port);
    t = new Thread()...;
    t.start();
    ...
}

setStop() {
    stopFlag = true;
    serverSocket.close()
    t.interrupt();
}
于 2012-04-13T07:14:51.157 に答える
0

を使用しserverSocket.setSoTimeout(t)ます。

于 2012-04-13T08:35:01.630 に答える