Стоп/прерывание потоков заблокировано при ожидании ввода из сокета

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

Ответы

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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