在说NIO之前,首先要清楚几个概念:
1. 同步/异步:通俗来说,同步或异步的主要区别点是,IO操作的主体是谁。
同步,我们的应用程序(代码)是直接参与IO操作,直到数据准备就绪;或者采用轮询的方式实时检查数据的状态,如果数据准备就绪就获取数据。
异步,是由操作系统进行所有的IO操作,我们程序不需要关心IO操作是怎么进行的,当操作系统完成IO操作之后,给我们的程序发送通知,我们直接拿走数据即可。
2. 阻塞/非阻塞:主要区别是在数据没有准备好时,此线程会不会一直处于等待状态,直到数据准备就绪。
阻塞,当某一线程进行IO操作,此线程会一直等待操作完成,而不能去做其他的事情。
非阻塞,线程不会一直等待着某一个IO操作完成,而是IO操作完成之后,直接去取数据。
NIO(同步非阻塞IO):
NIO三大组件: 1.channel(进行读写操作)
2.selector(相当于一个管家,轮询检查数据的就绪状态)
3.buffer(读取数据的缓冲)
NIO,采用多路复用IO模型,改善了传统IO对线程资源的消耗,将channel注册在selector上,通过selecotor轮询检查数据的就绪状态,一旦有数据准备好,会通知channel去取数据。当多个客户端连接时,并不是为每个客户端创建一个线程为其服务,而是通过注册的方式,当有客户端准备好数据时,再去取数据。
需要注意的是,同步非阻塞IO是读写方法非阻塞,select收到IO准备就绪的状态,还是需要用户自己进行读写操作。NIO围绕ByteBuffer进行读写操作,通过不断检查ByteBuffer的状态来判断IO操作是否完成。