Netty入门之IO(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq360694660/article/details/82178903

BIO:一请求一应答模型      阻塞同步IO

一个线程去监听客户端链接,当监听到客户端链接时,会为每个客户端创建一个新的线程去进行处理,处理结束,通过输出流返回应答给客户端,最后销毁线程。

缺点:由于会每个客户端请求创建新的线程去处理。所以随着并发量的增加,效率会大大降低。 还有可能出现线程堆栈溢出,创建新线程失败等问题。最终会导致无法提供提供服务。

伪异步IO通信=BIO+线程池    阻塞同步IO

在BIO基础上增加使用线程池管理客户端请求的线程。

当有一个新的客户端请求时,将客户端的WebSocket封装成一个异步任务。交由线程池进行处理。由于线程池中可以设置消息队列(任务)大小。以及最大线程数,所以资源是可控的,无论多少个并发客户端访问,都不出现因资源耗尽而造成的down机的情况。

缺点:当大量客户端接入,并发量很大时,可能会出现线程池线程阻塞等待。

NIO:非阻塞同步IO

1、缓冲区Buffer:读数据是从缓冲区读,写数据也是写入缓冲区。所有的数据都是通过缓冲区处理。

2、通道Channel:双向的,可以读写,或同时读写。流是单向的,只能读或写。

3、多路复用器Selector:Selector一直轮询Channel。当Channel发生读写操作时,该Channel就处于就绪状态,就会被Selector轮询出来。通过Selection.key()就可以获取就绪Channel的集合。之后再进行后续操作。

而由于

AIO:非阻塞异步IO

1、连接注册读写事件和回调函数

2、读写方法异步。

3、主动通知程序。

两种方式获取结果。

1、java.util.concurrent.Future类来保存异步操作的结果,Future get()方法(带或不带超时参数)在异步IO操作完成时获取其结果。

2、在异步操作时,传入回调的handler

该Handler是java.nio.channels.CompletionHandler接口的实现类。

JDK使用Epoll代替了传统的Selector实现。而且Epoll没有最大链接数的限制。可以接入数万级的客户端。

猜你喜欢

转载自blog.csdn.net/qq360694660/article/details/82178903