NIO (non-blocking)同步非阻塞IO,一个线程处理多个连接
服务端只会创建一个线程负责管理selector(多路复用器),selector(多路复用器)会去注册在其上的Channel通道的IO事件,并将监听到的事件进行相关的处理。
工作流程:
创建selector:NIO的核心组件之一,可以监听多个通道上的IO事件,并通过select()方法等待事件发生
注册Channel:通过channel的register()方法将channel注册到selector上,这样selector就可以监听channel上的IO事件
等待事件:调用select方法等待事件发生,当有事件发生时selector会通知相关的线程去处理
处理事件:根据不同的事件类型进行处理
关闭Channel:当channel不再使用时,需要调用close方法,同时需要调用buffer中clear方法,清空buffer中的数据,以释放内存资源。
NIO同步非阻塞,一个线程处理多个连接
传统的BIO,同步阻塞
区别:
阻塞和非阻塞:阻塞的模式同一时间只能处理一个请求;非阻塞的可以同时处理多个请求。
线程模型:NIO是基于事件驱动的,当一个IO操作完成之后,会通知相应的事件通知线程处理
BIO每个线程处理一个客户端的连接,不断轮询客户端中的输入输出流,以便及时响
应客户端的请求
内存消耗:NIO中使用的缓冲区是可以重复利用的,减少内存的分配和回收
BIO会为每个客户端分配缓冲区,容易造成内存资源的浪费
并发性能:非阻塞的模式,可以同时处理多个客户端的请求,提高并发处理的能力。
阻塞式的,每处理一个客户端的请求就会创建一个连接,当连接数过多的时候,
就容易出现线程饥饿和资源耗尽的情况。