回调在 NIO.2 库中的行为方式
How do callbacks behave in the NIO.2 library
我正在构建一个小型 client/Server 聊天应用程序。在尝试使用经典 NIO
库模拟它后,我遇到了 NIO.2
。
我的 "simulation" NIO.2 lib 与 classisc NIO 的目标是在通过 ArrayBlockingQueue
成对连接的多个线程中使用多个选择器,以避免网络读写次数。
我的问题是,如何在 NIO.2 库中使用 AsynchronousSocketChannels
和 CompletionHandlers
(据我理解是回调)同时处理多个事件?
经典 NIO
库使用 Selectors
,它在 select
调用 key set
后交付。这个 key set
然后可以迭代并且每个事件(读取、接受和写入)可以一个接一个地处理。
另一方面,NIO.2
回调没有这样的顺序。它们是异步的。那么,如果 2 个客户端同时向服务器发送一条消息,会发生什么?
然后同时进行 2 个回调 运行?如果是,那又如何呢?
他们每个 运行 是否在单独的线程中?
如果我从每个回调中获取这些消息并尝试将它们排入队列,如前所述ArrayBlockingQueue
,它们是否会互相等待?
So what happens if, for example, 2 clients send at exact the same moment a message to the server ?
客户端不与服务器共享公共连接。在服务器端,您将调用 AsynchronousSocketChannel#read
和您对两个客户端的回调,这将在一些字节到达时触发。
因此,两个回调可以同时 运行(因为它们是异步的),但它们对于每个客户端仍然是独立的,因此不会有问题。
Do they each run in seperate threads or not?
这取决于后台AsynchronousChannelGroup
的线程池(您可以自己指定或使用默认组)。
我用 NIO.2 创建了一个简单的网络库,我认为它会对你有所帮助:https://github.com/jhg023/SimpleNet
我正在构建一个小型 client/Server 聊天应用程序。在尝试使用经典 NIO
库模拟它后,我遇到了 NIO.2
。
我的 "simulation" NIO.2 lib 与 classisc NIO 的目标是在通过 ArrayBlockingQueue
成对连接的多个线程中使用多个选择器,以避免网络读写次数。
我的问题是,如何在 NIO.2 库中使用 AsynchronousSocketChannels
和 CompletionHandlers
(据我理解是回调)同时处理多个事件?
经典 NIO
库使用 Selectors
,它在 select
调用 key set
后交付。这个 key set
然后可以迭代并且每个事件(读取、接受和写入)可以一个接一个地处理。
另一方面,NIO.2
回调没有这样的顺序。它们是异步的。那么,如果 2 个客户端同时向服务器发送一条消息,会发生什么?
然后同时进行 2 个回调 运行?如果是,那又如何呢? 他们每个 运行 是否在单独的线程中?
如果我从每个回调中获取这些消息并尝试将它们排入队列,如前所述ArrayBlockingQueue
,它们是否会互相等待?
So what happens if, for example, 2 clients send at exact the same moment a message to the server ?
客户端不与服务器共享公共连接。在服务器端,您将调用 AsynchronousSocketChannel#read
和您对两个客户端的回调,这将在一些字节到达时触发。
因此,两个回调可以同时 运行(因为它们是异步的),但它们对于每个客户端仍然是独立的,因此不会有问题。
Do they each run in seperate threads or not?
这取决于后台AsynchronousChannelGroup
的线程池(您可以自己指定或使用默认组)。
我用 NIO.2 创建了一个简单的网络库,我认为它会对你有所帮助:https://github.com/jhg023/SimpleNet