12-2这里不注册直接执行run方法后,会出现StackOverflowError

来源:12-2 调度优化之发送数据调度优化

浪里龙虾最大个

2019-11-23

您好老师,12-2这里优化以后:
图片描述
会出现下图的问题:
图片描述
导致消息直接通过channel写出去了,不会去注册。这个在发送稍微大一点的文件的时候,会一直循环执行processor.onConsumeCompleted(args);会出现下图的情况:
图片描述

写回答

1回答

Qiujuer

2019-11-25

StackOverflowError

从你的调用链来看,的确是出现了递归循环,导致你的栈不够。

//img1.sycdn.imooc.com/szimg/5ddb37070968885622041360.jpg

建议检查一下这几个方法内部实现,看看是不是出现了递归调用的情况。看你的日志来说是这几个方法一直处于循环状态,如果在一个线程中一直这样就会出现你的问题,你需要看看在requestSend操作中是否真的将Callback交给了线程去再次调度,还是自己就执行了。



//img.mukewang.com/szimg/5ddb379d097036b713420654.jpg

从你的代码来看的确是这里再次执行了,并未交给线程去再次调度。而课程优化,我记得是尝试发送,如果发送后还有则进行二次调度。你可以往课程后面继续看看。

0
3
Qiujuer
回复
浪里龙虾最大个
嗯嗯,看了当时的代码的确是有这个问题。其实很大程度是因为nio的底层实现其实是有bug的。之前我测试nio的调度,发现有些步骤并未按其api描述一样运行。所以我们不得不在某些调度层面作出妥协。
2019-11-25
共3条回复

Socket网络编程进阶与实战 系统掌握Socket核心技术

理论+实践,系统且深入掌握Socket核心技术,从容应对各种Socket应用场景的不二之选

2324 学习 · 476 问题

查看课程