NIO实施的最佳模式?

时间:2009-09-21 15:29:06

标签: java nio

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

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

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

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

实施此方法的最佳方法是什么?

4 个答案:

答案 0 :(得分:4)

查看 Reactor Pattern

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

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

您尝试通过从IO转换为NIO来解决的问题是什么?

答案 1 :(得分:3)

你真的应该关注米娜,

http://mina.apache.org/

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

答案 2 :(得分:3)

我发现ROX Java NIO Tutorial对于开始使用NIO非常有用。

Grizzly是另一个NIO框架(类似于MINA)。

答案 3 :(得分:1)

另请参阅netty,它非常快且功能丰富,也可用于大型系统以及Redhat(jboss),Twitter,Facebook ......等大公司。