我正在将我们的 java 代码转换为使用 NIO,但我不确定设计它的最佳方式。
我最初的方法是创建一个选择器线程池。线程根据需要启动/终止,并且在以循环方式连接/接受通道时将通道注册到选择器线程。从那里,每个线程在 select() 上阻塞,并且当被唤醒时,将运行与具有选定键的每个通道相关联的适当回调。
除了这种“多选择器线程”设计之外,我还看到有人说要使用单个选择器线程和一个调度线程池。当准备好执行 IO 操作时,选择器会通知调度程序线程,然后调度程序线程会处理请求。这种模型的好处是不会阻塞 IO 线程,但现在我们将所有 IO 强制到单个线程中并在调度程序中处理同步/事件队列。
此外,我将无法使用单个直接字节缓冲区来读取每个通道,将其直接传递到回调中。相反,每次读取到数组并重置时,我都必须将数据复制出来。(我认为..)
实现这一点的最佳方法是什么?