Причина прерывания исключения

Из документа J2me мы знаем, что:

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

Вопрос в том, возможно ли получить такое исключение, если из одного потока я вызываю Thread.Interupt() для другого потока, где метод Run() другого потока ожидает на InputStream.Read(char[]buf)?

2 ответа

Решение

Поведение блокировки чтения в ответ на прерывание потока фактически не определено. Смотрите эту давнюю ошибку для деталей. Суть в том, что иногда вы получаете EOF, иногда вы получаете IOException.

К сожалению нет java.io.* классы не реагируют на прерывания, когда они заблокированы в методах чтения или записи. Обычно вам нужно закрыть поток, а затем обработать IOException это брошено. Я повторяю этот шаблон по всему коду:

try {
    for (;;) {
        try {
            inputStream.read(data);

            thread.join();
        }
        catch (IOException exception) {
            // If interrupted this isn't a real I/O error.
            if (Thread.interrupted()) {
                throw new InterruptedException();
            }
            else {
                throw exception;
            }
        }
    }
}
catch (InterruptedException exception) {
}

Альтернативно новее java.nio.* классы лучше обрабатывают прерывания и генерируют InterruptedIOExceptionс, когда они прерываются. Обратите внимание, что это исключение происходит от IOException а не из InterruptedException так что вам, вероятно, понадобится два catch пункты для обработки любого типа исключения, один для InterruptedException и один для InterruptedIOException, И вы захотите любой внутренний IOException поймать пункт, чтобы игнорировать InterruptedIOExceptions.

Другие вопросы по тегам