GuangchaoSun's Blog

BIO与NIO的区别

BIO和NIO的区别

BIO:
在JDK1.4之前,我们建立网络的时候采用BIO的方式,需要在服务端启动一个ServerSocket,在客户端启动一个Socket对服务端进行通信。默认情况下服务端需要对每个连接都建立一个线程来响应请求。客户端发送请求后,先咨询服务端是否有线程响应,如果没有就会一直等待或者遭到拒绝。如果有的话,客户端线程会等待请求结束后才继续执行。

NIO:
当一个连接创建后,不需要对应一个线程,这个连接会被注册到多路复用器上面,所以所有的连接只需要一个线程就可以搞定,当这个线程中的多路复用器进行轮询的时候,发现连接上有请求的话,才开启一个线程进行处理。

NIO比BIO先进的地方?
借用知乎的一个回答:假如有10000个连接,4核CPU ,那么bio 就需要一万个线程,而nio大概就需要5个线程(一个接收请求,四个处理请求)。如果这10000个连接同时请求,那么bio就有10000个线程抢四个CPU ,几乎每个CPU 平均执行2500次上下文切换,而nio 四个处理线程,几乎每个线程都对应一个CPU ,也就是几乎没有上下文切换。效率就体现出来了。

reference: