选择器(Selector)
基本介绍
用一个线程,处理多个客户端连接,就会用到NIO的Selector(选择器)。
Selector能够检测多个注册的服务端通道上是否有事件发生。如果有事件发生,便获取事件,然后针对每个事件进行响应的处理。
这样可以用单线程去管理多个通道,也就是管理多个连接和请求。

用一个线程,处理多个客户端连接,就会用到NIO的Selector(选择器)。
Selector能够检测多个注册的服务端通道上是否有事件发生。如果有事件发生,便获取事件,然后针对每个事件进行响应的处理。
这样可以用单线程去管理多个通道,也就是管理多个连接和请求。

NIO中所有的IO都是从通道(Channel)开始的。NIO的通道类似于流,但是有区别:
通道可读可写,流一般是单向的(只能读或者写,所以之前socket的demo里面分别创建一个输入流和输出流)。
通道可以异步读写。
通道总是基于缓冲区Buffer来读写

缓冲区(Buffer):缓冲区本质上是一个可读可写的内存块。
可以理解成一个数组,该对象提供了一组方法,可以轻松的操作内存块。
缓冲区内置了一些机制,能够跟踪和记录缓冲区的状态变化情况。
Channel提供从网络读取数据的通道,但是读取或者写入数据都必须经过Buffer。

Java NIO,全称为 java non-blocking IO ,是指JDK提供得到新API。从JDK1.4开始,Java提供了一系列改进的输入/输出的新特性,被统称为NIO(New IO),是同步非阻塞的。
NIO有三大核心部分,Channel(通道),Buffer(缓冲区),Selector(选择器)。
NIO是面向缓冲区编程。
数据读取到一个缓冲区中,需要时可以再缓冲区前后移动,增加了处理过程中的灵活性,使用它可以提供非阻塞式的高伸缩网络。
Java NIO的非阻塞模式,使一个线程从通道发送或者读取数据,但是它仅能得到目前可用的数据。如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞。所以只至数据变的可用之前,该线程可以继续做其他事情。
非阻塞写也是这样,一个线程请求写入一些数据到某个通道,但是不需要等待它完全写入,这个线程可以去做别的事情。
通俗理解:NIO可以做到用一个线程来处理多个操作。
假设有10000个请求过来,根据实际情况,可以分配50或者100个线程来处理。而不是像之前阻塞IO那样,必须分配10000个线程。