BIO:采用BIO通信模型的服务端通常由一个独立的Acceptor线程负责接收客户端的连接,它接收到客户端的连接后,会为每一个客户端创建一个新的线程进行处理,返回数据后会销毁线程,典型的一请求一应答模型,该模型缺乏弹性伸缩能力,当服务端接收并发数量比较多时, 系统将会发生堆栈溢出和不能创建新线程,导致服务端不能对外提供服务
线程数与客户端请求数1:1
伪异步IO通信
当一个客户端请求到达时,将其封装成一个task投入到线程池进行处理,线程池可以设置消息(工作)队列,不过随着大量并发,可能造成阻塞
NIO通信
缓冲区Buffer:NIO中所有数据都通过缓冲区操作
通道Channel:双向
多路复用器Selector:类同监听器,轮询注册在其上的Channel,如果某个Channel发生读或写状态,selector就可以将其挑选出来,由于JDK 新版采用epoll代替传统selector实现,并没有最大连接数的限制
Selector允许单线程处理多个 Channel,如果应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便
AIO通信:异步非阻塞IO