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

我的套接字也有同样的问题,并且中断()不起作用。我的问题通过关闭套接字解决了。因此,在 setStop() 方法中(如上所述),您必须调用serverSocket.close()(您显然必须使 serverSocket 成为类成员或其他东西)。

于 2012-04-13T07:20:57.707 回答
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 回答
2

如果您有一些代码,其中包含您计划更改stopFlag. 如果它在线程之外,您可能会在线程上使用 a .interrupt(),然后在线程上使用 a .destroy()。尝试在服务器套接字上添加超时可能不是一个理想的解决方案,请参阅java api 中的setSoTimeout()方法。DatagramSocket

于 2012-04-13T07:16:37.327 回答
0

使用serverSocket.setSoTimeout(t).

于 2012-04-13T08:35:01.630 回答