В прошлом этот вопрос, без сомнения, задавался в различных формах, но не столько для конкретного сценария.
Какой самый правильный способ остановить поток, который блокирует, ожидая получения сетевого сообщения по 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)
используйте какое-то состояние, которое переворачивается в методе прерывания. Это лучший способ? Или есть более элегантный способ?
Спасибо