Tomcat 中的 NIO 源码分析
我们看到,这里又没有进行实际的处理,而是将这个 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 = ; (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |