Java NIO-非阻塞通道与AsynchronousChannels

Bob*_*r02 4 java asynchronous nio channels

Java NIO提供SocketChannelServerSocketChannel可以将其设置为非阻塞模式(异步)。大多数操作返回的值对应于成功或该操作尚未完成。是什么目的AynchronousSocketChannel,并AsynchronousServerSocketChannel随后,除了回调的功能?

Nic*_*olt 6

当使用采用CompletionHandler的方法时,AynchronousSocketChannelAsynchronousServerSocketChannel派上用场了。

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

asynchronousServerSocketChannel.accept(Void, new ConnectionHander()); 
Run Code Online (Sandbox Code Playgroud)

处理客户端连接ConnectionHanderCompletionHandler的实现在哪里。

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

替代代码可能如下所示:

SocketChannel socketChannel = serverSocketChannel.accept();
Run Code Online (Sandbox Code Playgroud)

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

在一天结束时,您会根据您的特定用例进行选择,尽管我通常前者会生成更清晰、更可靠的代码。


use*_*421 5

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

就在那里,您有误解。非阻塞模式不同于异步模式。

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

异步操作在您调用该方法时开始,并在后台继续,其结果可在以后通过回调或a获得FutureAsynchronousSocketChannel您在问题中提到的etc类支持此模式。