毫无疑问,过去曾以各种形式提出过这个问题,但对于特定场景并没有那么多。
在等待通过 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
}
}
}
现在,更正确的方法是使用该interrupt()
方法吗?例如添加以下方法:
@Override
public void interrupt() {
super.interrupt();
// flip some state?
}
我唯一担心的是,是socket.receive()
不是一种不可中断的阻塞方法?我想到的一种方法是在该方法调用中实现上述中断方法,socket.close()
然后run
在SocketException
. 或者也许不是while(true)
使用在中断方法中翻转的某些状态。这是最好的方法吗?还是有更优雅的方式?
谢谢