Java NIO - 非阻塞通道 vs 异步通道

10

Java NIO提供了SocketChannelServerSocketChannel,可以设置为非阻塞模式(异步)。大部分操作返回一个值,表示操作成功或者操作尚未完成。那么除了回调功能,AynchronousSocketChannelAsynchronousServerSocketChannel的目的是什么?

2个回答

11

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

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

非阻塞操作要么传输数据,要么不传输数据。无论哪种情况都不会造成阻塞,并且一旦返回,操作就完成了。此模式由SocketChannelDatagramSocketChannelSelector支持。

异步操作在调用方法时开始,在后台继续进行,并通过回调或Future在以后的某个时间点提供结果。这种模式由你在问题中提到的AsynchronousSocketChannel等类支持。


6
The AynchronousSocketChannelAsynchronousServerSocketChannel在使用接受一个CompletionHandler的方法时表现出色。
例如,在服务器端的代码可能如下所示:
asynchronousServerSocketChannel.accept(Void, new ConnectionHander()); 

ConnectionHandler是一个客户端连接处理的CompletionHandler实现。

调用accept方法的线程可以继续执行其他任务,NIO API会在客户连接建立时(我认为这是操作系统级别的中断)调度回调给CompletionHandler

另一种代码可能是这样的:

SocketChannel socketChannel = serverSocketChannel.accept();

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

归根结底,您可以根据特定使用情况进行选择,但我通常认为前者会产生更清晰、更可靠的代码。


当使用Future时,同样的事情也会发生。这并不是说它有什么特别之处。在这两种情况下,操作都是异步进行的。唯一的区别在于发现结果的方式。 - undefined
@user207421 抱歉,我应该表达得更清楚一些,另一种选择是使用ServerSocketChannel - 我已经相应地进行了更新。 - undefined
没有改进。当使用FutureCompletionHandler时,它们会发挥出自己的作用:也就是说,无论如何都要使用它们。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接