InterruptedException的原因

8

从J2me文档中我们了解到:

java.lang.InterruptedException 当一个线程等待、休眠或者被其他线程中断时,会抛出该异常。

问题是,如果我在一个线程中调用Thread.Interupt()来中断另一个线程,在另一个线程的Run()方法中正在等待InputStream.Read(char[]buf),是否可能会出现这样的异常?

2个回答

6

实际上,线程中断对于阻塞读取的行为是不确定的。有关详细信息,请参见这个长期存在的错误。简而言之,有时会得到EOF,有时会得到IOException。


3
通常情况下,你什么也得不到。 - erickson
长期存在的 bug 在 2011 年得到解决: "在 Solaris 上,由于传统的可中断 I/O 默认被禁用,因此这在 jdk7 中不再是问题。它从未在 Winodws 上实现,并且自 jdk1.3 以来也没有在 Linux 上实现过。" - user207421

4

很遗憾, 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


很遗憾,在j2me中未实现interrupted()方法。 - Pirks
1
这是真的,而且也不在Thread.interrupt()中。那么你的中断信号将从哪里来呢?是什么促使了这个问题? - Jonathan Feinberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接