本文共 1642 字,大约阅读时间需要 5 分钟。
默认情况下,Netty服务端会根据CPU核数的2倍创建线程。如果调用EventExecutor.execute(task)时,当前线程不是Netty的Reactor线程(即不是NioEventLoop对应的线程实体),则会启动当前线程作为Reactor线程。
Netty通过监控Selector的阻塞时间,如果发现某次阻塞时间过短(默认512次),则重建Selector,并将旧Selector上的键转移至新Selector上。这种机制有效避免了JDK空轮询问题。
Netty在外部线程调用EventLoop方法时,通过inEventLoop()判断线程是否为Reactor线程,不是则将操作封装为Task存入MPSC队列,待Reactor线程执行。
Reactor线程模型主要分三部分:
new NioEventLoopGroup()创建NioEventLoopGroup实例。ThreadPerTaskExecutor线程执行器。EventExecutorChooser。EventLoopGroup bossGroup = new NioEventLoopGroup();EventLoopGroup workerGroup = new NioEventLoopGroup();
ThreadPerTaskExecutor负责创建线程。newChild()方法构建每个NioEventLoop。EventExecutorChooserFactory创建选择器。ThreadPerTaskExecutorexecute(Runnable)创建一个线程。FastThreadLocalThread,支持ThreadLocal操作。MultithreadEventExecutorGroup构造,每个NioEventLoop对应一个线程。EventExecutorChooserPowerOfTowEventExecutorChooser或GenericEventExecutorChooser。通过以上机制,Netty实现了高效的非阻塞I/O模型,支持多线程并发和异步操作。
转载地址:http://yvcfk.baihongyu.com/