由于近期开发一个中型的物联项目,带着十来个兄弟从底层硬件到无线局域通信到通用网关到netty高可用框架到spring cloud的后台开发到移动端APP开发到WEB前端的开发整体框架的搭建,虽然很辛苦,但我一直在给兄弟们说我们要三年内在物联行业占有一席之地,期待项目的成功。就因为这样,我写出了这个netty自学框架,虽然也是开始学习,我想通过项目的历练肯定对大家都有用,加油!
今天是:2018年5月31日 主题:EventLoop和线程模型
一、什么是线程模型
线程模型指定了操作系统、编程语言、框架或者应用程序的上下文中的线程管理的关键方面。
二、EventLoop的执行逻辑
三、EventLoop/线程的分配
1、异步传输
异步传输实现只使用了少量的EventLoop(以及和它们相关联的Thread),而且在当前的线程模型中,他们可能会被多个Channel所共享。这使得可以通过尽可能少量的Thread来支撑大量的Channel,而不是每个Channel分配一个Thread。
一旦一个Channel被分配给一个EventLoop,它将在它的整个生命周期中都使用这个EventLoop(以及相关联的Thread)。
2、阻塞传输
用于想OIO(就得阻塞I/O)这样的其他传输的设计略有不同。这里每一个Channel都将被分配给一个EventLoop(以及它的Thread)。如果你开发的应用程序使用过java.io包中的阻塞I/O实现,你可能就遇到过这种模型。
四、引导:在深入学习了ChannelPipeline、ChannelHandler和EventLoop之后,我们如何将这些部分组织起来呢?这个就是用“引导”。简单来说,引导一个应用程序就是对它进行配置,并使它运行起来的过程。
1、引导类的层次结构包括一个抽象的父类和两个具体的引导子类,如下图:
相对于将具体的引导类分别看作用于服务器和客户端的引导来说,服务器致力于使用一个父Channel来接受来自客户端的连接,并创建子Channel以用于它们之间的通信;而客户端将最可能只需要一个单独的、没有父Channel的Channel来用于所有的网络交互。两种应用程序类型之间通用的引导步骤由AbstractBootstrap处理,而特定于客户端或者服务器的引导步骤则分别由Bootstrap或ServerBootstrap处理。
2、引导客户端和无连接协议
Bootstrap类被用于客户端或者使用了无连接协议的应用程序中。其Bootstrap类的API如下:
引导客户端的引导过程如下:
3、引导客户端的代码:
4、引导服务器ServerBootstrap类的方法
引导客户端的引导过程如下:
5、引导服务器代码:
五、关闭
你需要关闭EventLoopGroup,它将处理任何挂起的事件和任务,并且随后释放所有活动的线程。这就是调用EventLoopGroup.shutdownGracefully()方法的作用。需要注意的是,shutdownGracefully()方法也是一个异步的操作,