остановить поток, который не прерывается - PullRequest
3 голосов
/ 15 июня 2010

У меня есть поток, который сидит и читает объекты из ObjectInputStream:

public void run() {
    try {
        ois = new ObjectInputStream(clientSocket.getInputStream());

        Object o;
        while ((o = ois.readObject()) != null) {
            //do something with object
        }
    } catch (Exception ex) {
        //Log exception
    }
}

readObject не генерирует InterruptedException, и, насколько я могу судить, исключение не генерируется, когда этот поток прерывается.Как мне остановить эту тему?

Ответы [ 3 ]

3 голосов
/ 15 июня 2010

Вызов close на входном потоке сокета. Вы должны быть в состоянии сделать это из другого потока.

2 голосов
/ 16 июня 2010

Похоже, что 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.

Если этот поток заблокирован в селекторе, то будет установлено состояние прерывания потока, и он сразу же вернется из операции выбора, возможно, с ненулевым значением, как если бы был вызван метод пробуждения селектора.

Если ни одно из предыдущих условий не выполняется, то будет установлено состояние прерывания этого потока.

Если это не сработает, я бы исследовал этот блок "сделать что-то с объектом" ипопытайтесь найти обработчик исключений, который использует ваше прерывание и игнорирует его.

0 голосов
/ 29 мая 2012

Вы можете попытаться поймать InterruptedIOException .Я не знаю, поможет ли это в вашем конкретном случае, но это наиболее понятный Java-способ справиться с такими случаями.

Я имею дело с удивительным случаем, когда, несмотря на то, что каким-то волшебным образом происходит перехват IOException, EOFException не зачитан, поэтому я нашел ваш ответ также интересным.В другом случае существует InterruptException, хотя оно не может быть: ссылка на неожиданное InterruptException .Эти случаи имеют общие проблемы с обработкой исключений, близкой к операциям ввода-вывода.

...