在Java中提供了三种IO模型:BIO、NIO、AIO,模型的选择决定了程序通讯的性能。java
同步并阻塞模型,服务器会为每个链接创建一个线程,若是链接过多,且线程不作任何事情,会极大的浪费资源,示意图以下: 服务器
流程:多线程
同步非阻塞模型,服务器端用一个线程处理多个链接,客户端发送的链接请求会注册到多路复用器上,多路复用器轮询到链接有IO请求就进行处理: 并发
NIO的非阻塞模式,使得一个线程从某通道发送请求或者读取数据时,若是目前没有可用的数据,不会使线程阻塞,在数据可读以前,该线程能够作其余的事情。异步
NIO有三大核心部分:性能
由图可知:操作系统
本质是能够读写数据的内存块,Channel读取或者写入的数据必须经过Buffer: 线程
java.nio.Buffer抽象类的属性:3d
// Invariants: mark <= position <= limit <= capacity private int mark = -1; private int position = 0; private int limit; private int capacity;
通道是双向的,能够读操做、也能够写操做。 java.nio.channels.Channel接口的经常使用实现类: code
FileChannel用于文件的数据读写,DatagramChannel用于UDP的数据读写,ServerSocketChannel和SocketChannel用于TCP的数据读写。
Selector选择器使用一个线程来维护。多个Channel会以事件的方式注册到同一个Selector,当有事件发生时,Selector会获取事件,而后针对每一个事件进行响应的处理。这样就没必要为每一个链接建立一个线程,不用维护多线程,也不会有多线程之间的上下文切换致使的系统的开销。 Selector示意图:
异步非阻塞模型,AIO引入异步通道的概念,使用了Proactor,只有有效的请求才启动线程,特色是先由操做系统完成后,才通知服务器端程序启动线程去处理,通常适用于链接数较多且链接时间较长的应用。