退出线程

时间:2012-04-13 07:06:41

标签: java multithreading udp

我有以下代码块:

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 个答案:

答案 0 :(得分:6)

我也遇到了套接字问题,而interrupt()也没有用。我的问题通过关闭套接字解决了。所以在setStop()方法中(如上所述)你必须调用serverSocket.close()(你显然必须使serverSocket成为类成员或其他东西)。

答案 1 :(得分: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();
}

答案 2 :(得分:2)

如果您有一些代码包含您计划更改stopFlag的代码,那将会有所帮助。如果它在线程之外,你可以在线程上使用.interrupt(),然后在线程上使用.destroy()。这可能是尝试在服务器套接字上添加超时的更好的解决方案,请参阅java api中setSoTimeout()的{​​{1}}方法。

答案 3 :(得分:0)

使用serverSocket.setSoTimeout(t)

相关问题