Ответ 1
Есть (потенциально) три способа сделать это:
-
Вызов
Socket.close()
в сокете закроет связанные объектыInputStream
иOutputStream
и вызовет блокирование любых потоков в Socket или (связанных) потоковых операциях, которые должны быть разблокированы. Согласно javadoc, операции с самим сокером будут вызыватьSocketException
. -
Вызов
Thread.interrupt()
будет (при некоторых обстоятельствах, которые не указаны) прервать операцию блокирующего ввода-вывода, бросьтеInterruptedIOException
.Обратите внимание на оговорку. По-видимому, подход "interrupt()" не работает на "большинстве" современных платформ Java. (Если у кого-то еще было время и склонность, они могли бы расследовать обстоятельства, в которых работает этот подход. Однако сам факт, что поведение является специфичным для платформы, должен быть достаточным, чтобы сказать, что вы должны использовать его только в том случае, если вам нужна ваша заявка для работы на определенной платформе. В этот момент вы можете легко "попробовать" для себя.)
-
Возможный третий способ сделать это - вызвать
Socket.shutdownInput()
и/илиSocket.shutdownOutput()
. В javadocs явно не указано, что происходит с операциями чтения и/или записи, которые в настоящее время заблокированы, но небезосновательно думать, что они разблокируют и выдают исключение. Однако, если javadoc не говорит, что происходит, тогда поведение следует считать специфичным для платформы.