电商网站开发环境,网站建设营销一站式服务,济南网站关键词优化公司,淘宝客网站做好了该怎么做我们的bossgroup和workgroup都是使用的NioEventLoopGroup。其内部有一个EventExecutor类型的数组用来存储所有的线程组。
NioEventLoopGroup {EventExecutor[] children;
}NioEventLoopGroup继承自MultithreadEventExecutorGroup#xff0c;构造函数不指定线程数默认会根据系…我们的bossgroup和workgroup都是使用的NioEventLoopGroup。其内部有一个EventExecutor类型的数组用来存储所有的线程组。
NioEventLoopGroup {EventExecutor[] children;
}NioEventLoopGroup继承自MultithreadEventExecutorGroup构造函数不指定线程数默认会根据系统cpu进行计算获取。是一个线程池实现类。
在MultithreadEventExecutorGroup构造函数里初始化children。调用newChild方法创建NioEventLoop实例赋给children。EventExecutor[] children 元素实例类型是NioEventLoop。
来看下具体代码
protected MultithreadEventExecutorGroup(int nThreads, Executor executor,EventExecutorChooserFactory chooserFactory, Object... args) {checkPositive(nThreads, nThreads);if (executor null) {//executor 初始化executor new ThreadPerTaskExecutor(newDefaultThreadFactory());}children new EventExecutor[nThreads];for (int i 0; i nThreads; i ) {boolean success false;try {//newChild方法就是创建一个NioEventLoop实例设置executorchildren[i] newChild(executor, args);success true;}}//...
}executor是ThreadPerTaskExecutor类型其execute方法就是创建一个线程执行runnable参数任务。
public final class ThreadPerTaskExecutor implements Executor {private final ThreadFactory threadFactory;public ThreadPerTaskExecutor(ThreadFactory threadFactory) {this.threadFactory ObjectUtil.checkNotNull(threadFactory, threadFactory);}Overridepublic void execute(Runnable command) {threadFactory.newThread(command).start();}
}newChild方法就是创建一个NioEventLoop实例设置executor。
NioEventLoop是一个很重要的类很多事件逻辑都是在该类中完成。
下面是NioEventLoop类主要方法。
NioEventLoop继承自SingleThreadEventExecutor。是一个单线程处理类。我们创建的channel都会和该类进行绑定。
主要属性
属性名说明taskQueue任务队列被执行的任务首先会被放到任务队列。executor执行器上面创建child传入ThreadPerTaskExecutor类型selector绑定的selectorthread当前EventLoop的运行线程
主要方法
方法说明register(Channel channel)绑定channeladdTask(Runnable task)新增一个任务到TaskQueuepollTask()取出一个任务startThread()启动线程会判断当前EventLoop内的线程状态线程是否已运行否则调用 doStartThread()启动线程doStartThread()会调用executor.execute(Runnable)启动一个线程运行入参任务将启动线程赋值给thread变量。入参会调用run()方法。execute(Runnable task)执行一个任务首先会调用addTask加入队列然后判断是否wakeup执行线程inEventLoop(Thread thread)判断当前线程和内部变量thread是否是同一个线程runAllTasks(long timeoutNanos)执行任务队列里的任务select(curDeadlineNanos)调用Selector的select方法阻塞监听事件发生processSelectedKeys();处理监听到的SelectedKeysprocessSelectedKey(SelectionKey k, AbstractNioChannel ch)处理具体的某一key事件