Стоп/прерывание потоков заблокировано при ожидании ввода из сокета
Как говорится в заголовке, мне нужен способ остановить или прервать поток, который заблокирован, ожидая ввода из сокета.
Ответы
Ответ 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 работать не будет).