Java NIO - 非阻塞通道与异步通道

Posted

技术标签:

【中文标题】Java NIO - 非阻塞通道与异步通道【英文标题】:Java NIO - non-blocking channels vs AsynchronousChannels 【发布时间】:2014-04-06 07:53:10 【问题描述】:

Java NIO 提供SocketChannelServerSocketChannel,可以设置为非阻塞模式(异步)。大多数操作返回一个对应于成功或操作尚未完成的值。那么AynchronousSocketChannelAsynchronousServerSocketChannel 除了回调功能之外,还有什么用途呢?

【问题讨论】:

【参考方案1】:

AynchronousSocketChannel 和 AsynchronousServerSocketChannel 在使用采用 CompletionHandler 的方法时会产生自己的影响。

例如,服务器中的代码可能如下所示:

asynchronousServerSocketChannel.accept(Void, new ConnectionHander()); 

其中ConnectionHander 是处理客户端连接的CompletionHandler 的实现。

进行accept 调用的线程可以继续做其他工作,NIO API 将在建立客户端连接时处理对CompletionHandler 的回调调度(我相信这是操作系统级别的中断)。

替代代码可能如下所示:

SocketChannel socketChannel = serverSocketChannel.accept();

根据模式,调用线程现在被阻塞,直到建立客户端连接或返回null,让您进行轮询。在这两种情况下,都是你必须处理线程,这通常意味着更多的工作。

最终,您可以根据自己的特定用例进行选择,尽管我通常会生成更清晰、更可靠的代码。

【讨论】:

【参考方案2】:

可以设置为非阻塞模式(异步)

这就是你的误解,就在那里。非阻塞模式与异步模式不同

非阻塞操作要么传输数据,要么不传输。无论哪种情况,都没有阻塞,一旦返回,操作就完成了。 SocketChannel,DatagramSocketChannel,Selector.支持此模式

异步操作在您调用该方法时开始,并在后台继续,结果在稍后通过回调或Future 变得可用。您在问题中提到的 AsynchronousSocketChannel 等类支持此模式。

【讨论】:

以上是关于Java NIO - 非阻塞通道与异步通道的主要内容,如果未能解决你的问题,请参考以下文章

Java NIO的基本概念ChannelBufferSelector以及非阻塞网络通信案例

NIO:同步异步和阻塞非阻塞 buffer缓冲区

java网络编程基础—NIO非阻塞编程

异步通道上的非阻塞接收?

Java入门系列-23-NIO(使用缓冲区和通道对文件操作)

AIO编程