Java NIO – 非阻塞通道与AsynchronousChannels

Java NIO提供SocketChannelServerSocketChannel ,可以设置为非阻塞模式(异步)。 大多数操作返回与成功相对应的值或者尚未执行操作。 除了回调function之外, AynchronousSocketChannelAsynchronousServerSocketChannel的目的是什么?

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

那是你的误解。 非阻塞模式与异步模式不同

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

当您调用方法并在后台继续时,异步操作将启动,结果将在以后通过回调或Future 。 您在问题中提到的AsynchronousSocketChannel等类支持此模式。

当使用带有CompletionHandler的方法时, AynchronousSocketChannel和AsynchronousServerSocketChannel会自成一体。

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

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

ConnectionHander是CompletionHandler的一个实现,用于处理客户端连接。

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

替代代码可能如下所示:

 SocketChannel socketChannel = serverSocketChannel.accept(); 

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

在一天结束时,你根据你的特定用例选择你的选择,尽管我通常会产生更清晰,更可靠的代码。