IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。
同步思想:就是当程序处理完一个请求或者操作的时候,再返回给用户。用户等待时间长,且不能关闭该程序或者这个页面,必须等 待该请求运行完,才能关闭或者其他操作,用户体验差。
异步思想:就是当程序发出一个请求后,响应给用户,该请求已受理,你可以关闭或者操作其他事情,等处理完后再告诉用户,此次 操作已完成。
阻塞思想:当一个线程在执行该操作时,如果有其他请求执行一样的操作,那么后来的请求就保持等待状态,直到上一个线程执行完 该操作后,才开始执行。
非阻塞思想:当一个线程在执行该操作时,如果有其他请求执行一样的操作,那么该线程无需等待,直接执行该操作
经典故事案例:
- 人物:老张
- 道具:普通水壶(水烧开不响);响水壶(水烧开发出响声)
- 案例:
BIO:
同步阻塞 IO
在JDK1.4以前只要是网络IO操作,唯一的选择就是使用BIO(同步阻塞),当一个线程处理客户端的请求后,如果有其他客户端请求过来,只能等待,直到上一个线程处理完请求后,才会处理该客户端请求(单线程)。当然,也可以使用线程池来弥补该不足。但是线程的开启是有限制的,不同的操作系统对线程开启的数量都有不同的限制,如果线程数过多,操作系统会无法承担如此数量的线程使用,会导致服务器拒接客户端的请求。最终结果是导致服务器崩溃。因为线程的开销是很大的。同理,BIO不适合应用在高并发的场景中。
NIO:
同步非阻塞 IO
在JDK1.4之后,支持NIO,在BIO中一个请求对应一个线程,但是NIO在此基础上进行改善,其思想是当一个请求过来,会有一个类似管家的角色,该管家会不断轮询,如果有请求过来,会通知一个或者多个线程来处理,会有一个或多个线程专门来处理该请求,如果当前没有请求,该线程就可以处理其他的操作,而无需等待客户端的请求。NIO适用于多且短连接的场景,比如聊天室。
AIO:
异步非阻塞 IO
在JDK1.7以后,支持AIO 在NIO的基础上再进化,当IO请求过来时程序会响应该请求,但是具体的读写操作,交给操作系统来完成,当操作系统处理完后,通知该程序,此操作已处理完,再有该程序接管。