繁体   English   中英

任何使用 java.nio.* 中断 InputStream#read() 而不关闭套接字的方法?

[英]Any way of using java.nio.* to interrupt a InputStream#read() without closing socket?

您知道一种在不关闭相关套接字的情况下中断从 Java InputStream读取的方法吗?

这是当前获取套接字输入流并转换为可中断 DataInputStream 的构造策略:

InputStream interruptibleInputStream = Channels.newInputStream(Channels.newChannel(m_ConnectionData.getSocket().getInputStream()));
DataInputStream myInterruptibleDIS = new DataInputStream(interruptibleInputStream);

这利用了一个ReadableByteChannel ,它提供了一个read(ByteBuffer)方法,支持一个ClosedByInterruptException抛出。

问题是在DataInputStream上进行read()调用的线程上调用中断会导致底层套接字关闭。

对于我的上下文,我需要套接字保持打开状态; read调用正在等待未到来的用户输入,因此我使用中断将控制权传递回更高的组件,然后最终再次返回read

如果有人可以建议一种使用 JDK 内置类来实现这一点的方法,或者指出某些信息是不可能的,我将不胜感激。

我知道还有其他方法可以达到相同的效果,但还是很想知道这种方法是否可行。

如果在读取期间中断 InterruptibleChannel,它将被关闭并抛出 ClosedByInterruptException。 如果你只是想要一个读取超时,根本不要使用通道,只是一个普通的 Socket; 使用较短的超时调用 Socket.setSoTimeout(),并在每次超时触发时检查线程的 isInterrupted() 状态。 更好的是,查看您对中断线程的要求。 那个有什么用途?

暂无
暂无

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

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