Java NIO 提供SocketChannel
并且ServerSocketChannel
可以设置为非阻塞模式(异步)。大多数操作返回一个对应于成功或操作尚未完成的值。AynchronousSocketChannel
然后AsynchronousServerSocketChannel
,除了回调功能之外,还有什么目的?
2 回答
可以设置为非阻塞模式(异步)
这就是你的误解,就在那里。非阻塞模式不同于异步模式。
非阻塞操作要么传输数据,要么不传输数据。无论哪种情况,都没有阻塞,一旦返回,操作就完成了。此模式由SocketChannel,
DatagramSocketChannel,
和支持Selector.
异步操作在您调用该方法时开始,并在后台继续,结果稍后通过回调或Future
. AsynchronousSocketChannel
您在问题中提到的 etc 类支持此模式。
当使用采用CompletionHandler的方法时, AynchronousSocketChannel和AsynchronousServerSocketChannel会各自发挥作用。
例如,服务器中的代码可能如下所示:
asynchronousServerSocketChannel.accept(Void, new ConnectionHander());
处理客户端连接的CompletionHandlerConnectionHander
实现在哪里。
然后,进行接受调用的线程可以继续执行其他工作,并且 NIO API 将在建立客户端连接时处理对CompletionHandler的回调调度(我相信这是操作系统级别的中断)。
替代代码可能如下所示:
SocketChannel socketChannel = serverSocketChannel.accept();
根据模式,调用线程现在被阻塞,直到建立或null
返回客户端连接,让您去poll。在这两种情况下,都是你必须处理线程,这通常意味着更多的工作。
归根结底,您可以根据自己的特定用例进行选择,尽管我通常认为前者会生成更清晰、更可靠的代码。