前言:
目前各位老铁们对“netty代码”都比较讲究,各位老铁们都想要剖析一些“netty代码”的相关内容。那么小编也在网摘上收集了一些有关“netty代码””的相关内容,希望朋友们能喜欢,看官们快快来学习一下吧!今天看了一下netty的代码逻辑,写了一个简易的netty例子,主要用于理解。代码上传git云上。地址在下面
1。初始化线程
NioSelectorRunnablePool nioSelectorRunnablePool = new NioSelectorRunnablePool(Executors.newCachedThreadPool(), Executors.newCachedThreadPool());
第一个参数boss 线程 用于监听端口
主要做了哪些事情?
a.初始化一个boss线程组 传递参数 线程池,线程名称,select管理,获取selector并启动线程
第二个参数worker 线程负责数据读写
a.和boss线程相同,不过线程数量是cpu的2倍
启动线程 后
第一步
状态位(原子性)
2.boss 线程是阻塞的
worker阻塞500毫秒 如果没有连接就返回
3.任务队列处理 (线程安全的)
获取队列的所有数据开始执行
4对selector进行任务处理
boss处理selector
获取所有selector --此处和NIO服务端操作相同
ServerSocketChannel server = (ServerSocketChannel) key.channel();
// 新客户端
SocketChannel channel = server.accept();
// 设置为非阻塞
channel.configureBlocking(false);
// select管理中获取一个worker
Worker nextworker = getSelectorRunnablePool().nextWorker();
// 注册新客户端接入任务
nextworker.registerNewChannelTask(channel);
worker处理selector
worker主要用户处理连接后的读写操作
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> ite = this.selector.selectedKeys().iterator();
SelectionKey key = (SelectionKey) ite.next();
key中获取channel,进行数据读写
代码是参考的netty源码 地址 :
标签: #netty代码