如下内容摘自:敖丙肝了一个月的Netty知识点java
阻塞和非阻塞操做是针对发起的IO请求操做后是否马上返回一个标志信息而不让请求线程等待,当数据准备未完成时,请求线程的状态:服务器
阻塞:每每须要等待缓冲区中的数据准备好事后才处理其余的事情,不然一直等待在那里。网络
非阻塞:不管数据是否准备好,都会直接返回。多线程
同步与异步是基于应用程序和操做系统处理IO事件所采用的方式:异步
同步:应用程序要直接参与IO读写的操做。性能
异步:全部的IO操做交给操做系统去处理,应用程序只须要等待通知。操作系统
异步相比较于同步带来的直接好处就是在咱们处理IO数据的时候,异步的方式咱们能够把这部分等待所消耗的资源用于处理其余事务,提高咱们服务自身的性能。.net
NIO | BIO |
---|---|
基于缓冲区( Buffer ) | 基于流( Stream ) |
非阻塞 IO | 阻塞 IO |
选择器( Selector ) | 无 |
Blocking IO,是同步阻塞的IO模型,传统的IO【java.io包】就是这种模型。线程
BIO面向字节流或字符流,以流的方式顺序地处理一个或多个字节。3d
BIO的IO操做是阻塞式的:当一个线程调用read()或write()时,该线程被阻塞,直到有一些数据被读取,或数据彻底写入。该线程在此期间不能再干任何事情了。
采用BIO形式的网络通讯,服务器端启动一个ServerSocket,客户端须要启动Socket来进行一对一链接,若是客户端有多个客户端请求,当其中一个客户端线程链接成功后,其余的将会阻塞。若是须要实现服务端同时处理多个客户端线程,必然须要服务器端开启多线程与之对应,这样就会致使若是客户端请求过多,服务器线程开辟过多致使系统崩溃。
NIO是Java1.4引入的,相对于传统的IO来讲,N能够表明New的意思,表示新IO,但更为具体的理解是Non-blocking的意思,是一种同步非阻塞的IO模型。它提供了Buffer,Channel,Selector三大组件。
同步与非阻塞怎么理解,是否矛盾?
非阻塞体如今:用户程序发起IO操做请求后不等待数据,而是调用会当即返回一个标志信息告知条件不知足,数据未准备好,用户请求程序继续执行其余任务。执行完其余任务,用户程序会主动轮询查看IO操做条件是否知足,若是知足,则用户程序亲自参与拷贝数据动做,这是同步的过程。
NIO支持面向Buffer,基于Channel的IO操做,任何数据在Buffer中进行处理,且可以任意改变操做位置,处理灵活。
NIO的IO操做能够是非阻塞的:当一个线程执行从Channel读取数据的IO操做时,若是有数据,则返回数据;若是没数据,不须要阻塞,而是能够直接返回。
NIO实现非阻塞IO的其中关键组件之一就是Selector,能够注册多个Channel到一个Selector中。Selector能够不断执行select操做,判断这些注册的Channel是否有已就绪的IO事件,如可读,可写,网络链接已完成等。一个线程经过使用一个Selector管理多个Channel。
NIO就是一个线程负责全部请求链接但不处理IO操做,该线程只负责把链接注册到多路复用器上,多用复用器轮询到链接有IO请求时候再启动其它线程处理IO请求操做,实现一个线程或少许线程就能够对应众多的客户端线程。
JDK1.7中,java.nio.channels
包下增长了多个异步通道,是NIO的升级版本,实现AIO AsynchronousIO的异步非阻塞IO模型。
非阻塞前面已经解释过了,异步指的就是数据拷贝阶段彻底由操做系统处理,而应用程序只须要等待通知便可。