Java NIO提供了SocketChannel
和ServerSocketChannel
,可以设置为非阻塞模式(异步)。大部分操作返回一个值,表示操作成功或者操作尚未完成。那么除了回调功能,AynchronousSocketChannel
和AsynchronousServerSocketChannel
的目的是什么?
Java NIO提供了SocketChannel
和ServerSocketChannel
,可以设置为非阻塞模式(异步)。大部分操作返回一个值,表示操作成功或者操作尚未完成。那么除了回调功能,AynchronousSocketChannel
和AsynchronousServerSocketChannel
的目的是什么?
可以设置为非阻塞模式(异步)
你的误解就在这里。非阻塞模式不同于异步模式。
非阻塞操作要么传输数据,要么不传输数据。无论哪种情况都不会造成阻塞,并且一旦返回,操作就完成了。此模式由SocketChannel
、DatagramSocketChannel
和Selector
支持。
异步操作在调用方法时开始,在后台继续进行,并通过回调或Future
在以后的某个时间点提供结果。这种模式由你在问题中提到的AsynchronousSocketChannel
等类支持。
asynchronousServerSocketChannel.accept(Void, new ConnectionHander());
ConnectionHandler
是一个客户端连接处理的CompletionHandler实现。
调用accept方法的线程可以继续执行其他任务,NIO API会在客户连接建立时(我认为这是操作系统级别的中断)调度回调给CompletionHandler。
另一种代码可能是这样的:
SocketChannel socketChannel = serverSocketChannel.accept();
根据不同的模式,调用线程现在被阻塞,直到客户端连接建立或返回null
,让您进行轮询。在这两种情况下,都需要您处理线程,通常意味着更多的工作。
归根结底,您可以根据特定使用情况进行选择,但我通常认为前者会产生更清晰、更可靠的代码。
Future
时,同样的事情也会发生。这并不是说它有什么特别之处。在这两种情况下,操作都是异步进行的。唯一的区别在于发现结果的方式。 - undefinedServerSocketChannel
- 我已经相应地进行了更新。 - undefinedFuture
或CompletionHandler
时,它们会发挥出自己的作用:也就是说,无论如何都要使用它们。 - undefined