Java 停止未被中断的线程
我有一个线程,可以从ObjectInputStream中读取对象: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 }
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。