1:BIO(Blocking IO)
同步阻塞式IO
在JDK1.4之前,服务端先建立一个ServerSocket,然后客户端Socket请求连接时,服务端建立一个单独的线程处理这个请求。即:一个连接要求Server对应一个处理线程。
2:NIO(New IO)
BIO中一个连接建立后,需要一个线程处理。会占用或者浪费过多的资源。
NIO中一个连接创建后,不需要对应一个线程,这个连接会被注册到多路复用器上面。所有的连接只需要一个线程就可以搞定,当这个线程中的多路复用器进行轮询的时候,发现连接上有请求的话,才开启一个线程进行处理。
NIO基于Reactor,当socket有流可读或可写入socket时,操作系统会相应的通知引用程序进行处理,应用再将流读取到缓冲区或写入操作系统。 也就是说,这个时候,已经不是一个连接就要对应一个处理线程了,而是有效的请求,对应一个线程,当连接没有数据时,是没有工作线程来处理的。
3:NIO2/AIO
AIO基于Proactor模式;与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可。这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。 即可以理解为,read/write方法都是异步的,完成后会主动调用回调函数
参考:
http://qindongliang.iteye.com/blog/2018539