8

Java NIO 提供SocketChannel并且ServerSocketChannel可以设置为非阻塞模式(异步)。大多数操作返回一个对应于成功或操作尚未完成的值。AynchronousSocketChannel然后AsynchronousServerSocketChannel,除了回调功能之外,还有什么目的?

4

2 回答 2

9

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

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

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

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

于 2014-03-04T23:44:29.007 回答
6

当使用采用CompletionHandler的方法时, AynchronousSocketChannelAsynchronousServerSocketChannel会各自发挥作用。

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

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

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

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

替代代码可能如下所示:

SocketChannel socketChannel = serverSocketChannel.accept();

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

归根结底,您可以根据自己的特定用例进行选择,尽管我通常认为前者会生成更清晰、更可靠的代码。

于 2014-03-04T17:16:54.373 回答