Java NIO - 非阻塞通道与AsynchronousChannels

时间:2014-03-04 16:38:27

标签: java asynchronous nio channels

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

2 个答案:

答案 0 :(得分:4)

  

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

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

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

支持此模式

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

答案 1 :(得分:3)

AynchronousSocketChannelAsynchronousServerSocketChannel在使用CompletionHandler的方法时会自行出现。

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

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

其中ConnectionHanderCompletionHandler的实现,用于处理客户端连接。

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

替代代码可能如下所示:

SocketChannel socketChannel = serverSocketChannel.accept();

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

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