【问题标题】:The Cause of InterruptedException中断异常的原因
【发布时间】:2009-10-13 16:25:12
【问题描述】:

从 J2me 文档我们知道:

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

问题是,如果我从一个线程调用 Thread.Interupt() 用于其他线程,而其他线程的 Run() 方法在 InputStream.Read(char[]buf) 上等待,是否有可能得到这样的异常?

【问题讨论】:

    标签: java java-me


    【解决方案1】:

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

    【讨论】:

    • 通常你什么也得不到。
    • NB 长期存在的错误在 2011 年得到解决:“这在 jdk7 中不再是问题,因为传统的可中断 I/O 在 Solaris 上默认禁用。它从未在 Winodws 上实现,也没有从 jdk1.3 开始在 Linux 上实现。”
    【解决方案2】:

    不幸的是,不,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。

    【讨论】:

    • 不幸的是方法 interrupted() 没有在 j2me 中实现
    • 这是真的,在 Thread.interrupt() 中也没有。那么你的中断会从哪里来呢?提出这个问题的动机是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 2010-11-26
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多