Прерывание потока в Java для зависшего процесса - PullRequest
1 голос
/ 12 января 2012

Если у меня есть что-то вроде этого:

Thread t = new Thread(myThread);
t.start();

private static Runnable myThread = new Runnable() {
    public void run() {
        try{
            String line=null;
            while ((line = eStream.readLine()) != null){
                //do something
            }
         }
         catch (Exception e){}
    }
};  

Теперь, что происходит в цикле while, иногда readLine() зависает, потому что ожидает ввода от внешнего процесса.Так что в этом случае я пытаюсь установить таймер, и если он истекает, я interrupt this thread t с t.interrupt();

Теперь, когда я пытаюсь поймать InterruptedException после блока попытки, яполучая ошибку времени компиляции.Может кто-нибудь сказать мне в этом сценарии, как я могу поймать Прерванное Исключение?

Спасибо

Ответы [ 2 ]

2 голосов
/ 12 января 2012

Из документа для InterruptedException :

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

Я подозреваю, что вас интересует InterruptedIOException :

Сигналы о том, что операция ввода-вывода была прервана.Вызывается исключение InterruptedIOException, указывающее, что передача ввода или вывода была прервана, поскольку поток, выполняющий его, был прерван.

Я бы извлек эту новостную рассылку JavaSpecialists в чисто закрытых потоках gdownи, в частности, подраздел А как насчет потоков, заблокированных на IO? , который охватывает эту область более подробно.

2 голосов
/ 12 января 2012
Прерывание

не освобождает блокирующий вызов readLine (). Вы должны закрыть поток, чтобы сделать это.

Вы перехватываете InterruptedException (и игнорируете его) с помощью этой строки

catch (Exception e){}

Это не сработает

line = eStream.readLine().toString()

Так как он выдаст исключение NullPointerException, когда вы достигнете конца файла. Удалить .toString()

...