猿问

回调在 NIO.2 库中的行为如何

我正在构建一个小型客户端/服务器聊天应用程序。我NIO.2在尝试使用经典NIO库模拟它后遇到了它。

我使用 classisc NIO 对 NIO.2 库进行“模拟”的目标是在通过 a 成对连接的多个线程中使用多个选择器ArrayBlockingQueue,以避免网络读写时间。

我的问题是,如何在 NIO.2 库中使用AsynchronousSocketChannelsCompletionHandlers(根据我的理解作为回调)同时处理多个事件?

经典的NIOlib 使用Selectorswhich 在select调用 a后交付key set。这key set然后可以遍历每个事件(阅读,接受并写入)可以处理一个又一个。

NIO.2另一方面回调,没有这样的序列。它们是异步的。那么,例如,如果 2 个客户端在同一时刻向服务器发送消息,会发生什么?

那么 2 个回调是否同时运行?如果是,那么如何?它们是否都在单独的线程中运行?

如果我要从每个回调中获取这些消息并尝试将它们排入队列,如前所述ArrayBlockingQueue,它们会相互等待吗?


绝地无双
浏览 187回答 1
1回答

慕的地6264312

那么,例如,如果 2 个客户端在同一时刻向服务器发送消息,会发生什么?客户端不与服务器共享公共连接。在服务器端,您会AsynchronousSocketChannel#read为两个客户端调用回调,当一些字节到达时会触发。出于这个原因,两个回调可以同时运行(因为它们是异步的),但它们对于每个客户端仍然是独立的,所以不会有问题。它们是否都在单独的线程中运行?这取决于 backingAsynchronousChannelGroup的线程池(您可以自己指定或使用默认组)。我用 NIO.2 创建了一个简单的网络库,我认为它会帮助你:https : //github.com/jhg023/SimpleNet
随时随地看视频慕课网APP

相关分类

Java
我要回答