Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java NIO实现的最佳模型?_Java_Nio - Fatal编程技术网

Java NIO实现的最佳模型?

Java NIO实现的最佳模型?,java,nio,Java,Nio,我正在将java代码转换为使用NIO,但我不确定设计它的最佳方法 我最初的方法是创建一个选择器线程池。线程会根据需要启动/终止,通道以循环方式连接/接受时会注册到选择器线程。从那里,每个线程阻塞select(),当唤醒时,将运行与具有选定键的每个通道相关联的相应回调 除了这种“多选择器线程”设计之外,我还看到有人说使用一个选择器线程和一个调度线程池。当IO操作准备好执行时,选择器通知调度程序线程,然后调度程序线程处理该请求。此模型的优点是不阻塞IO线程,但现在我们将所有IO强制到单个线程中,并在

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

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

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

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


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

你真的应该调查一下米娜


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

看看反应器模式

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


通过将IO转换为NIO,您试图解决的问题是什么?

另外,您还可以了解哪些操作非常快速、功能丰富,并且在大型系统中以及Redhat(jboss)、Twitter、Facebook等大公司中使用

是的,尽管这是一个好主意,试着去了解封面下发生了什么。这正是我所做的。我并没有在我的项目中真正使用Mina,但我从阅读他们的实现、性能和可伸缩性中学到了很多。线程少了很多,这将简化我们的设计。Reactor模式是一个很好的选择。此设计的一些实现使用多个线程来处理I/O事件。这些设计很糟糕,无法达到非阻塞异步I/O的目的。在为高性能和可扩展的服务器编写设计时,您希望使用异步I/O调用,并将所有调用保持在一个线程上—
选择器
线程。