我打算在我的项目中使用java NIO,但我的要求之一是保持请求可配置,即客户端可以选择以下请求:1。阻塞,2。非阻塞。
那么,是否可以在同步中使用NIO。方式是什么?
创建频道时,客户端代码上有一个选项:
SocketChannel socketChannel = SocketChannel.open();
socketChannel.configureBlocking(true);
但是,当我将其设为真时,我会收到此错误。
This是我在this tutorial使用的客户端代码。
java.nio.channels.IllegalBlockingModeException
at java.nio.channels.spi.AbstractSelectableChannel.register(AbstractSelectableChannel.java:172)
at java.nio.channels.SelectableChannel.register(SelectableChannel.java:254)
at com.dds.client.DDSClient.run(DDSClient.java:77)
at java.lang.Thread.run(Thread.java:680)
答案 0 :(得分:3)
register(...)
的javadoc声明如果在阻塞模式的通道上调用该方法,则会抛出 异常。选择器只能处理非阻塞通道。
当您需要阻止语义时,您需要更改代码以使用阻止操作(例如read
或write
)而不是register
和select
。
答案 1 :(得分:1)
你不能在阻塞频道上使用select(),就像Javadocs所说的那样。您或多或少必须使用每个通道的线程模型。
这个奇怪的要求是什么原因?