加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.0577zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 系统 > 正文

Tomcat 中的 NIO 源码分析

发布时间:2020-01-12 00:37:54 所属栏目:系统 来源:站长网
导读:副标题#e# 虽然本文的源码篇幅也不短,但是 Tomcat 的源码毕竟不像 Doug Lea 的并发源码那么变态,对于大部分读者来说,阅读难度比之前介绍的其他并发源码要简单一些,所以读者不要觉得有什么压力。 本文基于 Tomcat 当前(2018-03-20)最新版本 9.0.6。 先简

我们看到,这里又没有进行实际的处理,而是将这个 SocketChannel 注册到了其中一个 poller 上。因为我们知道,acceptor 应该尽可能的简单,只做 accept 的工作,简单处理下就往后面扔。acceptor 还得回到之前的循环去 accept 新的连接呢。

我们只需要明白,此时,往 poller 中注册了一个 NioChannel 实例,此实例包含客户端过来的 SocketChannel 和一个 SocketBufferHandler 实例。

Poller

之前我们看到 acceptor 将一个 NioChannel 实例 register 到了一个 poller 中。在看 register 方法之前,我们需要先对 poller 要有个简单的认识。

public class PollerimplementsRunnable{ 

 

publicPoller throws IOException { 

// 每个 poller 开启一个 Selector 

this.selector = Selector.open; 

private Selector selector; 

// events 队列,此类的核心 

private final SynchronizedQueue<PollerEvent> events = 

new SynchronizedQueue<>; 

 

private volatile boolean close = false; 

private long nextExpiration = 0;//optimize expiration handling 

 

// 这个值后面有用,记住它的初始值为 0 

private AtomicLong wakeupCounter = new AtomicLong(0); 

 

private volatile int keyCount = 0; 

 

... 

敲重点:每个 poller 关联了一个 Selector。

Poller 内部围着一个 events 队列转,来看看其 events 方法:

public boolean events { 

boolean result = false; 

 

PollerEvent pe = ; 

(编辑:温州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读