Потоки Stop / Interrupt заблокированы при ожидании ввода из сокета - PullRequest
14 голосов
/ 21 июня 2009

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

Ответы [ 6 ]

12 голосов
/ 21 июня 2009

Вы можете просто закрыть () поток / сокет ввода-вывода из другого потока. Затем вы можете проверить на логическом поле volatile, если полученное исключение IOException связано с закрытием или чем-то еще. Я думаю, что закрытие может привести к исключению java.net.SocketException: Socket closed.

8 голосов
/ 21 июня 2009

Thread.interrupt () должен быть метод, который вы ищете. Убедитесь, что ваши методы доступа к входу также проверяют наличие InterruptedException и ClosedByInterruptException.

Также посмотрите на соответствующую страницу в руководстве по параллелизму Sun , как предлагает другое решение.

5 голосов
/ 21 июня 2009

Сокеты позволяют установить время ожидания с помощью метода setSoTimeout(). Это предпочтительный способ остановить их блокировку.

В противном случае вы можете взглянуть на пакет nio, который позволяет неблокировать ввод-вывод за счет дополнительной ручной работы для управления входящими и исходящими данными.

4 голосов
/ 22 ноября 2011

Я не видел socket.closeInput(). Тем не менее, я нашел socket.shutdownInput(). После вызова этого (из другого потока, который блокировал чтение естественно), мой вызов bufferedReader.close() работал нормально! (Я следовал за этим с звонками на printWriter.close() и socket.close().

1 голос
/ 02 сентября 2011

Попробуйте использовать sock.closeInput (), а затем sock.close ()

0 голосов
/ 27 марта 2012

Закройте сокет, и чтение будет разблокировано (выйдет с подклассом IOException). Реакция чтения на Thread.interrupt зависит от платформы (например, не будет работать в Solaris 10).

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