退出线程

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个回答

6

我也遇到了套接字的同样问题,调用 interrupt() 方法并没有起作用。我的问题是通过关闭套接字解决的。因此,在 setStop() 方法中(如上所述),您需要调用 serverSocket.close()(显然,您需要将 serverSocket 做成类成员或其他形式)。


我完全忘记了那个 :). 我希望你能把它看作是我的感激之情,因为我会为未来的读者编辑我的答案。 - Angelo Fuchs

2

如果您能提供一些包含您计划更改stopFlag代码的代码,那将非常有帮助。如果它在线程之外,您可能可以在线程上使用.interrupt(),然后在线程上使用.destroy()。这不是一个理想的解决方案,最好尝试在您的服务器套接字上添加超时,请参见java api中DatagramSocketsetSoTimeout()方法。


2
销毁操作是不必要且不推荐的。 - Angelo Fuchs
1
中断(interrupt)非常适合这种情况。它会在线程当前等待的地方抛出一个Interrupted Exception,然后可以在catch块中进行清理。 - Angelo Fuchs
你能否编辑你的帖子并发布更改标志的代码,这将有助于其他人解决这个问题。 - timash11
1
interrupt 不起作用是因为你有一个 catch (Exception ex) { ... } 捕获了它。请参阅http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html。 - artbristol
@timash11 我已经修改了代码。添加了 stopListening 部分。 - Akhil K Nambiar
显示剩余3条评论

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();
}

1
@AkhilKNambiar 我添加了 mistalee 的部分。请再试一次(并给他/她点赞)。 - Angelo Fuchs

0
使用 serverSocket.setSoTimeout(t)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接