【发布时间】:2009-10-13 16:25:12
【问题描述】:
从 J2me 文档我们知道:
java.lang.InterruptedException 当一个线程等待、休眠或以其他方式暂停很长时间并且另一个线程中断它时抛出。
问题是,如果我从一个线程调用 Thread.Interupt() 用于其他线程,而其他线程的 Run() 方法在 InputStream.Read(char[]buf) 上等待,是否有可能得到这样的异常?
【问题讨论】:
从 J2me 文档我们知道:
java.lang.InterruptedException 当一个线程等待、休眠或以其他方式暂停很长时间并且另一个线程中断它时抛出。
问题是,如果我从一个线程调用 Thread.Interupt() 用于其他线程,而其他线程的 Run() 方法在 InputStream.Read(char[]buf) 上等待,是否有可能得到这样的异常?
【问题讨论】:
实际上,响应线程中断而阻塞读取的行为是未定义的。有关详细信息,请参阅this long-standing bug。简而言之,有时你会得到 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.* 类可以更好地处理中断,并在它们被中断时生成InterruptedIOExceptions。请注意,此异常源自IOException 而不是InterruptedException,因此您可能需要两个catch 子句来处理任一类型的异常,一个用于InterruptedException,一个用于InterruptedIOException。你会希望任何内部的IOExceptioncatch 子句忽略InterruptedIOExceptions。
【讨论】: