线程执行器ThreadPerTaskExecutor

我们现在知道, 当一个新的客户端连接到服务器时, 通过选择器EventExecutorChooser选择一个NioEventLoop为其服务. 那么其实最终是由NioEventLoop封装的Thread为其服务.
在前面我们也说过, 在创建NioEventLoop时会创建线程选择器ThreadPerTaskExecutor, 由这个选择器创建底层的线程.下面我们就来说说这个选择器.

executor = new ThreadPerTaskExecutor(newDefaultThreadFactory());
​
public ThreadPerTaskExecutor(ThreadFactory threadFactory) {
    this.threadFactory = threadFactory;
}
@Override
public void execute(Runnable command) {
    threadFactory.newThread(command).start();
}

我们先说一下这个ThreadFactory. 它的默认实现如下

public DefaultThreadFactory(String poolName, boolean daemon, int priority, ThreadGroup threadGroup) {
    prefix = poolName + '-' + poolId.incrementAndGet() + '-';
    this.daemon = daemon;
    this.priority = priority;
    this.threadGroup = threadGroup;
}

我们看到, prefix = nioEventLoop-1- 如果是第二个NioEventLoop, 那么它的名称就叫做nioEventLoop-2- 以此类推.而且daemon=false .
而且底层创建的线程并不是JDK的Thread类线程, 而是Netty自己设计的线程类, 叫做FastThreadLocalThread . 从名字上可以看得出来, 这个线程类比JDK的线程类性能要快, 实际的确快, 后面的文章我们会讲解它. 最终就是由这个线程类执行后续的所有逻辑功能, 包括监听事件, 处理事件, 处理任务队列中的任务.

微信公众号

你可能感兴趣的:(Netty)