InterruptedException的原因

时间:2009-10-13 16:25:12

标签: java java-me

从J2me doc我们知道:

java.lang.InterruptedException当线程等待,休眠或以其他方式暂停很长一段时间并且另一个线程中断它时抛出。

问题是,如果从一个线程调用Thread.Interupt()为其他线程,其他线程在InputStream.Read(char [] buf)上等待其他线程的运行()方法,是否可以获得此类异常?

2 个答案:

答案 0 :(得分:5)

事实上,未定义阻塞读取以响应线程中断的行为。有关详细信息,请参阅this long-standing bug。缺点是有时候你会得到EOF,有时你会得到IOException。

答案 1 :(得分: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,另一个用于{ {1}}。并且你会希望任何内部InterruptedIOException catch子句忽略IOException s。