Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 停止未被中断的线程_Java_Multithreading_Executorservice_Objectinputstream - Fatal编程技术网

Java 停止未被中断的线程

Java 停止未被中断的线程,java,multithreading,executorservice,objectinputstream,Java,Multithreading,Executorservice,Objectinputstream,我有一个线程,可以从ObjectInputStream中读取对象: public void run() { try { ois = new ObjectInputStream(clientSocket.getInputStream()); Object o; while ((o = ois.readObject()) != null) { //do something with object }

我有一个线程,可以从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,据我所知,当这个线程被中断时,不会抛出异常。如何停止此线程?

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

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

这将强制调用
ObjectInputStream
。这会触发你的拦网,让你跳出圈套

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

您应该始终能够通过从另一个线程调用
objectReadingThread.interrupt()
来触发最后的
catch(Exception ex)
块(也称为异常执行器)。引述:

如果该线程在wait()的调用中被阻塞,wait(long), 或对象类或join()的wait(long,int)方法, join(long)、join(long,int)、sleep(long)或sleep(long,int)方法 则其中断状态将被清除,并且 接收中断异常

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

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

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

如果这不起作用,我将调查“对对象执行某些操作”块,并尝试找到使用中断并忽略它的异常生成器。

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


我正在处理一个惊人的案例,尽管以某种神奇的方式捕捉到了IOException,但EOFEException是未捕获的,所以我发现您的答案也很有趣。在另一种情况下,存在中断异常,尽管它不能是:。这些情况都有一些常见的问题,比如在处理接近I/O操作的异常时

来自@assylias的评论,你是对的,最初写的这句话并没有表明我的观点,readObject不是唯一一个中断会产生影响的地方。我删除了那句话,添加了javadoc。