15.4 I/O线程分配细节

    Netty使用线程池来为Channel的I/O和事件服务,不同的传输实现使用不同的线程分配方式;异步实现是只有几个线程给通道之间共享,这样可以使用最小的线程数为很多的平道服务,不需要为每个通道都分配一个专门的线程。

    下图显示如何分配线程池:

http://img.blog.csdn.net/20140807153624941?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWJjX2tleQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

    如上图所示,使用一个固定大小的线程池管理三个线程,创建线程池后就把线程分配给线程池,确保在需要的时候,线程池中有可用的线程。这三个线程会分配给每个新创建的已连接通道,这是通过EventLoopGroup实现的,使用线程池来管理资源;实际会平均分配通道到所有的线程上,这种分布以循环的方式完成,因此它可能不会100%准确,但大部分时间是准确的。

    一个通道分配到一个线程后,在这个通道的生命周期内都会一直使用这个线程。这一点在以后的版本中可能会被改变,所以我们不应该依赖这种方式;不会被改变的是一个线程在同一时间只会处理一个通道的I/O操作,我们可以依赖这种方式,因为这种方式可以确保不需要担心同步。

    下图显示OIO(Old Blocking I/O)传输:

http://img.blog.csdn.net/20140807153708044?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWJjX2tleQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

    从上图可以看出,每个通道都有一个单独的线程。我们可以使用java.io.*包里的类来开发基于阻塞I/O的应用程序,即使语义改变了,但有一件事仍然保持不变,每个通道的I/O在同时只能被一个线程处理;这个线程是由Channel的EventLoop提供,我们可以依靠这个硬性的规则,这也是Netty框架比其他网络框架更容易编写的原因。

results matching ""

    No results matching ""