1.传统的BIO
- 如果不开启多个线程则只能为一个客户端来提供服务
- 如果进来一个客户端就开启一个线程,则需要创建大量的线程,创建大量的线程需求耗费的资源很多
- 使用线程池来解决
- 传统的BIO有两个阻塞的地方 accept read
2.NIO概述
- Non-blocking IO(非阻塞IO)
- Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。
- 管道(双向)+缓冲区(用来存放数据),数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中
- Java NIO: Selectors(选择器)
- Java NIO引入了选择器的概念,选择器用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个的线程可以监听多个数据通道。
3.NIO与BIO
- IO为同步阻塞形式,NIO为同步非阻塞形式,NIO并没有实现异步,在JDK1.7后升级NIO库包,支持异步非阻塞
通信模型NIO2.0(AIO)
- BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情那么就会造成不必要的线程开销,当然可以通过线程池机制改善。
- NIO:同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
- AIO(NIO.2):异步非阻塞式IO,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。
4.BIO NIO
- BIO: 同步 阻塞 的IO
- NIO: 同步 非阻塞的IO(生产环境使用最多的一种IO)