Netty之EventLoop

简介: EventLoop本质是一个单线程执行器(同时维护了一个Selector),里面有run方法处理channel上源源不断的io事件。

1、什么是EventLoop

EventLoop本质是一个单线程执行器(同时维护了一个Selector),里面有run方法处理channel上源源不断的io事件。

2、什么是EventLoopGroup

EventLoopGroup是一组EventLoop,Channel一般会调用EventLoopgroup的register方法来绑定其中一个EventLoop,后续这个Channel上的io事件都由此EventLoop来处理(保证io事件处理时的线程安全)。

NioEventLoopGroupeventExecutors=newNioEventLoopGroup();

NioEventLoopGroup默认线程数为当前CPU核心数*2;如果有传参则以传参为准。

NioEventLoopGroup支持IO事件,普通任务事件,定时任务事件。

示例:

packagenetty.c2;
importio.netty.channel.nio.NioEventLoopGroup;
importjavafx.scene.layout.GridPane;
importjava.util.concurrent.TimeUnit;
publicclassTestEventLoop {
publicstaticvoidmain(String[] args) {
NioEventLoopGroupeventExecutors=newNioEventLoopGroup(2);
System.out.println(eventExecutors.next());
System.out.println(eventExecutors.next());
System.out.println(eventExecutors.next());
System.out.println(eventExecutors.next());
// 执行普通任务//        eventExecutors.next().submit(() -> {//            try {//                System.out.println("thread");//                Thread.sleep(1000);//            } catch (InterruptedException e) {//                e.printStackTrace();//            }//        });//        System.out.println("main");// 执行定时任务eventExecutors.next().scheduleAtFixedRate(() -> {
try {
System.out.println("thread");
Thread.sleep(1000);
            } catch (InterruptedExceptione) {
e.printStackTrace();
            }
        }, 0, 1, TimeUnit.SECONDS);
    }
}

3、EventLoop和Channel

eventLoop和channel进行了绑定。

image.png

考虑一个问题:

如果一个work可以绑定多个channel。那么如果某个channel上的handler执行过久,就直接影响work上其他线程的执行时间,怎么处理?

解法:创建一个独立的EventLoopGroup。channel.pipeline().addLast(新的group, "xxx", new ChannelInboundHandlerAdapter(){})。要注意handler的顺序。

image.png

image.png

剖析:如果两个handler绑定的是同一个线程,那么就直接调用;否则,把要调用的代码封装为一个任务对象,由下一个handler线程来调用(切换线程)。

相关文章
netty
netty
64 0
|
3月前
|
网络协议 前端开发 安全
Netty
Netty
173 1
|
3月前
|
JavaScript 网络安全
Netty在Firbase中的使用
这篇文章探讨了Netty在Firebase实时数据同步服务中的应用,包括长轮询、HTTP 1.1 keep-alive和流水线化、控制SSL处理器等,展示了Netty如何支持Firebase处理高并发的网络通信和多种协议。
45 1
|
5月前
|
消息中间件 编解码 Java
Netty介绍
Netty介绍
55 4
Netty介绍
|
6月前
|
存储 安全 Java
为什么Netty要造FastThreadLocal?
Netty 的 FastThreadLocal 是一种高效的线程局部变量,设计用于解决标准 ThreadLocal 的性能和内存泄漏问题。FastThreadLocal 通过使用数组而非哈希表存储数据,避免了哈希冲突带来的性能损耗,查询效率达到 O(1)。此外,FastThreadLocal 提供了 remove() 方法和 FastThreadLocalRunnable 类,以防止内存泄漏,确保在执行完成后自动清理对象。相比于 ThreadLocal,FastThreadLocal 具有更高的性能和安全性。
netty练习
netty练习
44 0
|
监控 安全 Java
Netty之EventLoop 解读
Netty之EventLoop 解读
|
缓存 Java 测试技术
Netty实战(七)EventLoop和线程模型
简单地说,线程模型指定了操作系统、编程语言、框架或者应用程序的上下文中的线程管理的关键方面。
181 0
|
设计模式 安全 Java
Netty是什么?怎么学?
Netty是什么?怎么学?
167 0
|
安全
关于netty的EventLoop
关于netty的EventLoop
关于netty的EventLoop