Java之NIO理解

NIO是一种新的IO模型(Recator模型),新主要体现在多路复用,事件驱动上

1、多路复用,一个线程可以处理多个socket请求,通过多个socket注册在一个select上面,然后不断调用select来获取被激活的socket,即达到在一个线程中,处理多个socket请求目的,而在传统(同步阻塞)IO模型中,需要通过多线程的方式才能达到此目的,传统的IO模型由于使用多线程,就会有线程数量以及线程上下文切换等限制。

2、事件驱动(其实就是观察者模式),模型图如下

如图所示,EventHandler为IO的事件处理器(观察者),Reactor为管理EventHandler类,事件的注册,删除等(被观察者),reactor的handle_event函数会不断循环调用内核的selec()函数(同步事件多路分离器(一般是内核)的多路分离函数),只要某个文件句柄被激活(可读写),select()函数就返回,handle_event会调用相关的事件处理函数EventHandler上的handle_event()函数。

时序图如上图所示,使用reactor模型之后,用户线程注册事件之后,可以去执行其他事情(异步),等相关读写工作就绪之后,Reactor会通知用户线程进行读写。用户IO线程轮询是否读写好等工作由Reactor上的handle_events处理,Reactor会调用内核select函数检查socket的状态。当socket被激活的时候,通知用户线程(或调用户线程的回掉函数)。执行EventHandler的hand_event()函数。由于select函数是阻塞的,所以多了复用模型被叫做异步阻塞模型,注意,这里所说的阻塞并不是socket上read等操作的阻塞,socket上这些操作时非阻塞的(事件模型)。

参考:http://blog.csdn.net/baixiaoshi/article/details/48708347

猜你喜欢

转载自chenghao666.iteye.com/blog/2370848