netty 中NioEventLoop对应的中execute()

netty 中至关重要的NioEventLoop

NioEventLoop extends SingleThreadEventLoop

从继承结构上面可以明显的看到是一个单线程的实现。但它实际是implements  java.util.concurrent.Executor   下文写关于它的execute(runnable) 方法。

而NioEventLoop实际内部封装了一个Executor,它在MultithreadEventExectorGroup  的构造方法中进行初始化的, 实际是  new ThreadPerTaskExecutor(threadFacotry)  它对于本身execute(runnable) 方法 的实现就是通过

new Thread(runnable).start();开启线程的。这点也是非常重要的。

上文讲了两个Executor 对于execute(runnable),实现,非常重要的是这两个实现是差异性特别大的,这个也是netty中对于线程使用至关重要的。

在NioEventLoop中 参考源码会发现,在执行execute(runna)时,我们会将runnable 加入到一个LinkedBlockingQueue<Runnable>  任务队列中,并未立即开启线程且执行。而实际上会调用上文提到的Executor.execute(runnable)  来开启一个跟该类绑定的线程。该线程实际会调用NioEventLoop.run()方法,该方法会进行select对应策略的操作。因此如果是NioEventLoop 开启执行execute(runnable )时候,要注意只是将该任务添加到队列中,会在开启的线程中,调用该任务的run()方法进行执行。

 

特别注意这点:不要踩坑。

posted @ 2020-09-11 19:44  serviceOBJ  阅读(289)  评论(0)    收藏  举报