Onc*_*nca 2 java multithreading interrupt
我在正在执行的服务器中有一个线程(线程a) object = ois.readObject();.当我从客户端拔出LAN线路时,该线程不会出现异常并继续从流中读取.
服务器上的另一个线程(线程b)每隔一秒尝试向客户端写一个字节,以检查连接是否仍然存在: checkingStream.writeObject(b);
当我拉这个线,我得到一个IOException从checkingStream.writeObject(b);.我想"线程b"导致"线程a"停止从流中读取并继续执行代码/抛出异常.
threadA.interrupt();不起作用.我该怎么办?
当我从客户端拔出LAN线路时,该线程不会出现异常并继续从流中读取.
好吧,我会说这是正确的行为.互联网(通常)和基于IP的网络协议旨在适应本地中断......如断开与网络的连接.
在您的情况下,问题是读取线程正在做的事情是告诉网络堆栈它希望数据每秒传递一次.因此,网络堆栈无法判断网络是否存在问题...或远程服务...或者1秒内没有数据只是正常行为.
解决方案是按EJP建议设置读取超时,或者删除旨在检测网络始终存在的东西.我推荐后者.除非您有特定于应用程序的特定需求,要知道网络始终存在,否则最好忽略任何短期网络中断,和/或将应用程序级协议设计为具有弹性.
threadA.interrupt(); 不起作用.我该怎么办?
读取超时是一种选择.到unjam阻塞的另一种方法read调用的是有另一个线程调用close()的Socket.这将导致与套接字关联的Java流上的任何挂起读取或写入以异常终止.
关于读取超时:
但是这个论坛的其他答案都说不安全
在收到套接字超时后尝试继续使用套接字是不安全的.如果使用超时,则需要在套接字级别超时后丢弃连接并创建新连接.
如果您不想这样做,那么您需要以不同的方式实现超时.例如,创建一个新线程来监视读取线程的状态及其读取的数据.如果新线程检测到读取线程没有活动,它可以引发警报......同时在读取调用中阻止读取线程,以防连接恢复生命.