Этот вопрос, несомненно, задавался в разных формах в прошлом, но не столько для конкретного сценария.Каков правильный способ остановить поток, ожидающий сетевой активности?
Каков наилучший способ остановить поток, который блокируется, ожидая получения сетевого сообщения через 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
в catch для SocketException
. Или, может быть, вместо while(true)
используйте какое-то состояние, которое попадает в метод прерывания. Это лучший способ? Или есть более элегантный способ?
Благодаря
Err, нет. прерывание, чтобы остановить поток.На самом деле это единственный способ сделать это, если поток может быть заблокирован в блокирующем вызове, который реагирует на прерывания (например, Thread.sleep, Object.wait, чтение из прерывистого канала и т. Д.). Прочитайте http://download.oracle.com/javase/tutorial/essential/concurrency/interrupt.html. –