Прервать поток в DatagramSocket.receive - PullRequest
20 голосов
/ 12 января 2011

Я создаю приложение, которое прослушивает как TCP, так и UDP, и у меня возникли некоторые проблемы с моим механизмом выключения. Когда я вызываю Thread.interrupt() в каждом из потоков прослушивания, поток TCP прерывается от прослушивания, а прослушиватель UDP - нет. Чтобы быть точным, поток TCP использует ServerSocket.accept(), который просто возвращает (без фактического подключения). В то время как поток UDP использует DatagramSocket.receive() и не завершает этот метод.

Это проблема в моей JRE, моей ОС, или я должен просто переключиться на (Datagram)Socket.close()?

ОБНОВЛЕНИЕ: Я нашел анализ проблемы. Это подтверждает, что поведение не соответствует.

Ответы [ 3 ]

29 голосов
/ 12 января 2011

Распространенная идиома прерывания сетевого ввода-вывода - закрытие канала. Это была бы хорошая ставка, если вам нужно эффективно прервать его, пока он ожидает отправки или получения.

public class InterruptableUDPThread extends Thread{

   private final DatagramSocket socket;

   public InterruptableUDPThread(DatagramSocket socket){
      this.socket = socket;
   }
   @Override
   public void interrupt(){
     super.interrupt();  
     this.socket.close();
   }
}
2 голосов
/ 12 января 2011

Насколько я знаю, close() - это правильный способ прервать заблокированный сокет.Прерывание и сохранение чего-то, что, возможно, уже сделало частичное чтение или запись, делает вещи излишне сложными.Проще иметь дело только с «успехом» или «отказом» от результата.

0 голосов
/ 12 января 2011

DatagramSocket.receive блокируется, пока не получит дейтаграмму. Вероятно, вам нужно использовать setSoTimeout для тайм-аута.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...