Похоже, что clientSocket
- ваша единственная внешне видимая ссылка.Из другого потока вызовите clientSocket.close()
, что заставит ObjectInputStream
к вызвать IOException при вызове readObject () .Это должно активировать ваш блок catch и вывести вас из цикла.
Перечитывая ваш вопрос, вы говорите, что readObject
не вызывает InterruptedException.Вы правы в этом вопросе: я смотрю на источник для readObject
прямо сейчас, и он ни throws
, ни явным образом не скрывает InterruptedException
.
Вы всегда должны иметь возможность запустить этот последний блок catch (Exception ex)
(обработчик исключений AKA), вызвав objectReadingThread.interrupt()
из другого потока (или как вы его называете своим потоком чтения).Цитирование Javadoc :
Если этот поток заблокирован при вызове методов wait (), wait (long) или wait (long, int) класса Objectили из методов этого класса join (), join (long), join (long, int), sleep (long) или sleep (long, int), его состояние прерывания будет очищено и получитInterruptedException.
Если этот поток заблокирован в операции ввода-вывода для прерываемого канала, то канал будет закрыт, состояние прерывания потока будет установлено, и поток получит исключение ClosedByInterruptException.
Если этот поток заблокирован в селекторе, то будет установлено состояние прерывания потока, и он сразу же вернется из операции выбора, возможно, с ненулевым значением, как если бы был вызван метод пробуждения селектора.
Если ни одно из предыдущих условий не выполняется, то будет установлено состояние прерывания этого потока.
Если это не сработает, я бы исследовал этот блок "сделать что-то с объектом" ипопытайтесь найти обработчик исключений, который использует ваше прерывание и игнорирует его.