Java NIO的选择器如何检查引擎盖下的可用事件?

时间:2015-07-10 07:29:20

标签: java multithreading sockets nio

有一个类似的问题被问到before,但我想再次提出,希望有人能帮助清除一些事情。作为一个实验,我尝试写一个天真的"非阻塞"不使用NIO的Java服务器,基本上需要三个线程:

  1. 主服务器线程 - accept()新的套接字连接,并将每个新套接字放入队列
  2. 读取工作线程 - 遍历队列中的每个套接字,并从每个套接字的输入流中读取一点,并将其存储在InputQueue
  3. 编写工作线程 - 根据从每个套接字读取传入请求的时间,此工作程序将遍历需要响应的所有套接字,并再次在每次采取时写入几个字节的响应。
  4. 在上一个问题中,有人指出Java NIO的select()机制远比在每个套接字上轮询好得多,并且在每次通过队列后稍微休眠一下。我知道选择在理论上是如何运作的,但是我很难理解的主要内容如下:如果民意调查是坏的和低效的,那么select()如何做到这一点呢?

    更新:我找到了this page,它更清楚地了解了原生select()如何在幕后工作。有趣的是,确实,我最初的推测似乎是正确的:select()以线性方式工作,探测每个请求的文件描述符,类似于轮询机制的作用:

      

    他们[select()poll()]都处理文件描述符   线性方式。你要求他们检查的描述符越多,速度越慢   他们得到。只要你超过一百个文件描述符   左右 - 当然取决于你的CPU和硬件 - 你将开始   注意到仅仅等待文件描述符活动和   在检查它是哪个文件描述符后,需要一个   重要的时间,成为一个瓶颈。

1 个答案:

答案 0 :(得分:1)

它调用操作系统中的select()方法,其中:

  • 如果套接字接收缓冲区中有数据或FIN,则认为套接字是可读的
  • 认为套接字是可写的,套接字发送缓冲区中有空间(即大部分时间)。