从J2me文档中我们了解到:
java.lang.InterruptedException 当一个线程等待、休眠或者被其他线程中断时,会抛出该异常。
问题是,如果我在一个线程中调用Thread.Interupt()来中断另一个线程,在另一个线程的Run()方法中正在等待InputStream.Read(char[]buf),是否可能会出现这样的异常?
实际上,线程中断对于阻塞读取的行为是不确定的。有关详细信息,请参见这个长期存在的错误。简而言之,有时会得到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
catch子句忽略InterruptedIOException
。