我怎么能在一个线程中停止块方法DatagramSocket.receive()

clo*_*oud 10 java sockets multithreading

DatagramSocket在主线程中创建一个,然后创建一个内部类线程来监听端口.当我DatagramSocket在主线程中关闭时,它总是遇到错误,socket closed因为在内部类线程中我调用了receive()方法,并且它阻塞了内部类线程.这是内部类的代码:

class ReceiveText extends Thread
{
    @Override
    public void run()
    {
        while(true)
        {
            byte[] buffer = new byte[1024];
            DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
            try {
                udpSocket.receive(dp);//blocked here
                byte[] data = dp.getData();
                String message = new String(data, 0 , dp.getLength());
                setTxtAreaShowMessage(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在关闭DatagramSocket之前停止内部类线程,但stop()不推荐使用该方法.我怎样才能做到这一点?

pru*_*nge 14

关闭套接字,这将阻止来自阻塞的receive()调用.如果首先设置一个关闭标志,那么在catch(IOException)块中,如果设置了标志,则可以安全地忽略该异常.(您可能也可以在DatagramSocket上使用isClosed()方法而不是标志)