Netty学习(五)介绍线程模型

125 阅读2分钟

一、Netty是个啥?

前面几篇介绍了Nio的一些知识,下面正式开始学习Netty。

可以从下面几点介绍Netty:

  • 异步的,基于事件驱动的高性能的网络应用程序框架
  • 底层是对Nio的进一步的封装
  • 有自己的线程模型

其他的暂时想不起来了

二、线程模型是个啥?

常见的线程模型有两种:

  • 传统阻塞io模型
  • Reactor模型
    • 单Reactor单线程
    • 单Reactor多线程
    • 主从Reactor多线程

上面的这个分类是不是看不懂?那就通过图来研究先上面说的内容...

1、传统阻塞线程模型

上个图

这个是我们常见的一种线程模型,特点如下:

  1. 一个连接对应一个线程。连接数多时,线程数也多,这样势必造成系统资源的浪费。
  2. 连接建立后,加入没有数据可读,线程会阻塞在read的操作这边,线程就阻塞了,也是浪费资源。

2、Reactor模式(Dispatcher模式)

上面的模型总结下会有两个解决办法:

  1. io复用。
  2. 使用线程池。

基于这两个解决办法再去看Reactor模型。

2.1 单Reactor单线程

上图:

和上面的传统的阻塞线程模型比较的话,这个模型多出了一个Reactor对象去处理请求,对于过来的请求通多dispather进行分发。

问题在于处理业务的能力还是太弱了。

2.2 单Reactor多线程

上图:

这个图和上面的模型比较,加入了线程池去处理业务操作。

简单说明下:Handler对象通过read方法去读取请求内容,然后进行分发,分发给线程池中的线程去处理,处理的结果返回给Handler对象,最终通过send方法返回给上层。

这个模型虽然解决了业务处理的问题,还是没有解决请求过多导致的Reactor瓶颈问题。

2.3 主从Reactor多线程

上图:

这个模型和上面的模型比较,分出了主从Reactor线程去处理不同的请求。主线程用来处理连接请求,子线程用来处理除连接请求外的请求。