gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:25:16 25 4
gpt4 key购买 nike

您知道在不关闭关联套接字的情况下中断从 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。如果你只是想要一个读超时,根本不要使用 channel ,只是一个普通的套接字;使用较短的超时调用 Socket.setSoTimeout() ,并在每次超时触发时检查线程的 isInterrupted() 状态。更好的是,检查中断线程的要求。这是干嘛的?

关于java - 在不关闭套接字的情况下使用 java.nio.* 中断 InputStream#read() 的任何方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8494763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com