【问题标题】:stop thread that does not get interrupted停止不被中断的线程
【发布时间】:2010-06-15 16:16:47
【问题描述】:

我有一个线程可以从 ObjectInputStream 中读取对象:

public void run() {
    try {
        ois = new ObjectInputStream(clientSocket.getInputStream());

        Object o;
        while ((o = ois.readObject()) != null) {
            //do something with object
        }
    } catch (Exception ex) {
        //Log exception
    }
}

readObject 不会抛出 InterruptedException 并且据我所知,当该线程被中断时不会抛出异常。如何停止此线程?

【问题讨论】:

    标签: java multithreading executorservice objectinputstream


    【解决方案1】:

    在套接字输入流上调用close。您应该可以从另一个线程执行此操作。

    【讨论】:

      【解决方案2】:

      看来clientSocket 是您唯一的外部可见参考。从另一个线程,调用clientSocket.close()

      这将强制将ObjectInputStream 调用为throw the IOException on the readObject()。这应该会触发你的 catch 块并让你脱离循环。

      重新阅读您的问题,您说readObject 不会抛出 InterruptedException。在这一点上你是对的:我现在正在查看readObject 的来源,它既不是throws,也没有明确隐藏InterruptedException

      您应该始终能够通过从另一个线程(或您为阅读线程命名的任何名称)调用 objectReadingThread.interrupt() 来触发最终的 catch (Exception ex) 块(AKA 异常吞噬者)。引用Javadoc

      如果该线程在调用 wait()、wait(long) 时被阻塞, 或 Object 类或 join() 的 wait(long, int) 方法, join(long)、join(long, int)、sleep(long) 或 sleep(long, int)、方法 这个类,那么它的中断状态将被清除,它会 收到中断异常。

      如果此线程在可中断的 I/O 操作中被阻塞 通道然后通道将被关闭,线程的中断状态 将被设置,并且线程将收到 ClosedByInterruptException。

      如果该线程在 Selector 中被阻塞,则该线程的中断 状态将被设置,它将立即从选择中返回 操作,可能具有非零值,就像选择器的 唤醒方法被调用。

      如果前面的条件都不成立,那么这个线程的中断 状态将被设置。

      如果这不起作用,我会调查“用对象做某事”块并尝试找到消耗您的中断并忽略它的异常吞噬者。

      【讨论】:

      • 来自
      • @assylias,你说得对,最初写的句子并没有说明我的观点,即 readObject 不是唯一会产生影响的地方。我删除了那句话并添加了 javadoc。
      【解决方案3】:

      你可以尝试捕捉InterruptedIOException。我不知道在您的特定情况下它是否有帮助,但它是处理此类情况的最清晰的 Java 方式。

      我正在处理一个惊人的案例,尽管以某种神奇的方式捕获了 IOException,但 EOFException 未被捕获,所以我发现你的答案也很有趣。在另一种情况下,尽管不可能是 InterruptException:link to unexpected InterruptException。这些情况在处理接近 I/O 操作的异常方面存在共同问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-31
        • 1970-01-01
        • 2011-05-14
        • 1970-01-01
        相关资源
        最近更新 更多