我们知道,在NioEventLoopGroup的实例化过程中,会创建一个新的默认执行器ThreadPerTaskExecutor。
protected MultithreadEventExecutorGroup(int nThreads, Executor executor,
EventExecutorChooserFactory chooserFactory, Object... args) {
if (nThreads <= 0) {
throw new IllegalArgumentException(String.format("nThreads: %d (expected: > 0)", nThreads));
}
if (executor == null) {
executor = new ThreadPerTaskExecutor(newDefaultThreadFactory());
}
.
.
.
}
让我们来看一下ThreadPerTaskExecutor的实现。
/**
* 他传入了一个线程工厂,用来创建一个新的线程
* 并实现java并发包中的Executor接口,里面调用线程工厂创建一个新的线程,传入Runnable,并启动这个线程
* 所以执行器的作用就是,执行一个实现了Runnable接口的任务
* 线程工厂的存在使得创建线程与线程的执行任务解耦,这与我们一般编写线程有区别。而线程工厂会为它即将创建的线程提供一些配置信息
* @author lenovo
*
*/
public final class ThreadPerTaskExecutor implements Executor {
private final ThreadFactory threadFactory;
public ThreadPerTaskExecutor(ThreadFactory threadFactory) {
if (threadFactory == null) {
throw new NullPointerException("threadFactory");
}
this.threadFactory = threadFactory;
}
@Override
public void execute(Runnable command) {
threadFactory.newThread(command).start();
}
}