繁体   English   中英

停止不被中断的线程

[英]stop thread that does not get interrupted

我有一个线程,它坐在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,据我所知,当此线程被中断时不会抛出异常。 我该如何阻止这个帖子?

在套接字输入流上调用close 你应该能够从另一个线程做到这一点。

似乎clientSocket是您唯一的外部可见引用。 从另一个线程,调用clientSocket.close()

这将强制ObjectInputStream 在readObject()调用上抛出IOException 这应该触发你的catch阻止并让你走出循环。

重新阅读你的问题,你说readObject不会抛出InterruptedException。 你在这一点上是正确的:我现在正在查看readObject的源代码,它既不会throws也不会显式隐藏InterruptedException

你应该始终能够通过从另一个线程(或你读取线程命名的任何线程)调用objectReadingThread.interrupt()来触发最终的catch (Exception ex)块(AKA exception eater)。 引用Javadoc

如果在调用Object类的wait(),wait(long)或wait(long,int)方法,或者join(),join(long),join(long,int)方法中阻塞了这个线程,sleep(long)或sleep(long,int),这个类的方法,然后它的中断状态将被清除,它将收到InterruptedException。

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

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

如果以前的条件都不成立,则将设置该线程的中断状态。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM