netty-transpot 分析

https://juejin.im/post/5bdaa2afe51d45685f443757—Netty NioEventLoop run 过程源码分析

重点:

https://www.cnblogs.com/xiangnan6122/category/1374017.html

https://segmentfault.com/a/1190000006824196——基于 jdk nio 服务器代码 跟netty的架构逻辑 类似

自己的一些总结:

1、Executor线程组 怎么用?

每一个Handler都可以在一个单独的线程池中运行(在 加入pipeline.add handler的时候配置)。为了不阻塞WORK线程组的的IO线程 获取 Read Write等事件。建议应用层的hander放到单独的线程组。

2、handler之间怎么传递数据数据?

handler通过 fireChannelRead(Object msg)向handler链表中之后的handler传递数据。每个handler处理后的数据放在 msg 参数中向后传递

3、NioEventLoop线程 什么时候启动?

Boss线程和Work线程都是在 channle注册到线程的 selector的时候启动

4、Executor线程池中线程如何启动、运行?

Executor线程,在第一次执行handler任务的时候启动(SingleThreadEventExecutor.execute(Runable task) 方法中启动,此方法会判断线程是否启动,没启动就启动线程)

在 DefaultEventExecutor.run()中运行,DefaultEventExecutor和NioEventLoop都继承SingleThreadEventExecutor。

DefaultEventExecutor和NioEventLoop 都用 SingleThreadEventExecutor.takeTask() 获取任务;该方法会把scheduleTaskQueue(PriorityQueue)中的Task放入 taskqueue(LinkedBlockingQueue) 中 一起执行。

线程启动之后会一直运行,之后有任务就是往线程的 taskqueue 中 添加任务

4、jstac抓线程栈,看到的线程是什么样子?

所有 NioEventLoop(IO读写)线程 启动后 会一直是Runable状态,Selector.select(long time)方法,会阻塞线程,但是线程状态还是 Runable

所有ExecutorGroup线程,会从taskqueue中获取任务,能取到任务的时候 是Runable状态,不能取到任务的时候是Waiting(park)状态。因为 taskqueue 用的是LinkedBlockingQueue,用ReetrantLock Condition await方法 等待 队列元素

猜你喜欢

转载自blog.csdn.net/weixin_42226343/article/details/101322916