6

我正在将我们的 java 代码转换为使用 NIO,但我不确定设计它的最佳方式。

我最初的方法是创建一个选择器线程池。线程根据需要启动/终止,并且在以循环方式连接/接受通道时将通道注册到选择器线程。从那里,每个线程在 select() 上阻塞,并且当被唤醒时,将运行与具有选定键的每个通道相关联的适当回调。

除了这种“多选择器线程”设计之外,我还看到有人说要使用单个选择器线程和一个调度线程池。当准备好执行 IO 操作时,选择器会通知调度程序线程,然后调度程序线程会处理请求。这种模型的好处是不会阻塞 IO 线程,但现在我们将所有 IO 强制到单个线程中并在调度程序中处理同步/事件队列。

此外,我将无法使用单个直接字节缓冲区来读取每个通道,将其直接传递到回调中。相反,每次读取到数组并重置时,我都必须将数据复制出来。(我认为..)

实现这一点的最佳方法是什么?

4

3 回答 3

4

看看反应堆模式

http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf

您希望选择器如何工作实际上取决于您的用例。(连接数、消息大小等)

您想通过从 IO 转换为 NIO 来解决什么问题?

于 2009-09-21T16:01:26.027 回答
3

你真的应该看看米娜,

http://mina.apache.org/

它解决了你提到的所有问题。

于 2009-09-21T15:49:56.973 回答
1

还可以看看netty,它非常快速且功能丰富,也被用于大型系统和 Redhat (jboss)、Twitter、Facebook 等大公司......

于 2012-02-21T09:47:11.450 回答