【问题标题】:Exit from a thread退出线程
【发布时间】:2012-04-25 13:38:03
【问题描述】:

我有以下代码块:

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 后立即退出,该怎么办。

【问题讨论】:

    标签: java multithreading udp


    【解决方案1】:

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

    【讨论】:

    • 我完全忘记了那个:)。我希望您感谢我为未来的读者编辑我的答案。
    【解决方案2】:

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

    【讨论】:

    • 销毁是不必要且不推荐的。
    • 感谢您的输入,这突出了一个事实,即中断并不理想,因为销毁不会在线程之后清理,最好通过停止接收挂起来让它自然结束。
    • 中断非常适合这种情况。它在线程当前等待的地方抛出一个中断异常,之后可以在catch块中清理
    • 您能否编辑您的帖子并发布您更改标志的代码,这将有助于人们协助解决此问题。
    • interrupt 不起作用,因为您有 catch (Exception ex) { ... } 忽略它。见ibm.com/developerworks/java/library/j-jtp05236/index.html
    【解决方案3】:

    我不确定停止标志来自哪里,但无论如何,答案是中断。

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

    【讨论】:

    • @AkhilKNambiar 我在下面添加了 mistalee 的部分。请再试一次(并给他/她投票)
    【解决方案4】:

    使用serverSocket.setSoTimeout(t)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 2011-07-23
      • 2012-10-01
      相关资源
      最近更新 更多