NIO中可配置的阻止和非阻塞请求

时间:2011-01-10 11:56:06

标签: java nio

我打算在我的项目中使用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)

2 个答案:

答案 0 :(得分:3)

register(...)的javadoc声明如果在阻塞模式的通道上调用该方法,则会抛出 异常。选择器只能处理非阻塞通道。

当您需要阻止语义时,您需要更改代码以使用阻止操作(例如readwrite)而不是registerselect

答案 1 :(得分:1)

你不能在阻塞频道上使用select(),就像Javadocs所说的那样。您或多或少必须使用每个通道的线程模型。

这个奇怪的要求是什么原因?