停止等待网络活动的线程的正确方法是什么?

Nic*_*men 5 java networking multithreading interrupt-handling

毫无疑问,这个问题过去曾以各种形式被提出过,但针对特定场景却没有那么多。

停止等待通过 UDP 接收网络消息时阻塞的线程的最正确方法是什么。

例如,假设我有以下主题:

public class ClientDiscoveryEngine extends Thread {

    private final int PORT;

    public ClientDiscoveryEngine(final int portNumber) {
        PORT = portNumber;
    }

    @Override
    public void run() {
        try {
            socket = new DatagramSocket(RECEIVE_PORT);

            while (true) {
                final byte[] data = new byte[256];
                final DatagramPacket packet = new DatagramPacket(data, data.length);

                socket.receive(packet);
            }
        } catch (SocketException e) {
            // do stuff 1
        } catch (IOException e) {
            // do stuff 2
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,更正确的方法是使用该interrupt()方法吗?例如添加以下方法:

@Override
public void interrupt() {
    super.interrupt();
    // flip some state?
}
Run Code Online (Sandbox Code Playgroud)

我唯一关心的是,是socket.receive()不是一种不可中断的阻塞方法?我想到的一种方法是在该方法调用中实现上面的中断方法socket.close(),然后runSocketException. 或者也许不while(true)使用在中断方法中翻转的某些状态。这是最好的方法吗?或者有更优雅的方式吗?

谢谢

JB *_*zet 4

接收方法似乎不可中断。您可以关闭套接字:javadoc 说:

当前阻塞在该套接字上的任何线程receive(java.net.DatagramPacket)都会抛出 SocketException

您还可以用来setSoTimeout使接收方法仅阻塞一小段时间。该方法返回后,您的线程可以检查它是否已被中断,并在这段时间内再次重试接收。