Причина прерывания исключения
Из документа 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
поймать пункт, чтобы игнорировать InterruptedIOException
s.