请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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

正在回答 回答被采纳积分+3

1回答

Qiujuer 2019-11-25 10:09:35

StackOverflowError

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

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

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



https://img1.sycdn.imooc.com//szimg/5ddb379d097036b713420654.jpg

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

0 回复 有任何疑惑可以回复我~
  • 提问者 浪里龙虾最大个 #1
    您好,老师。图中的代码是老师12-2优化后的代码,是因为我自己的代码出现了这个问题,所以使用老师的代码测了一下,也出现了同样的问题。想了一下,不知道对不对,java nio是水平触发的,所以只要缓冲区还不满,写事件就会一直就绪。所以老师在此节中说的注册过程(提问中第二张图的红框部分)是不会执行的,因为args每次都可以写入数据到channel当中,所以此时整个写的调度过程都只在同一个线程。
    回复 有任何疑惑可以回复我~ 2019-11-25 13:34:53
  • 提问者 浪里龙虾最大个 #2
    老师在后续的代码中修复了这个问题,这里只针对12-2优化的代码
    回复 有任何疑惑可以回复我~ 2019-11-25 13:39:42
  • Qiujuer 回复 提问者 浪里龙虾最大个 #3
    嗯嗯,看了当时的代码的确是有这个问题。其实很大程度是因为nio的底层实现其实是有bug的。之前我测试nio的调度,发现有些步骤并未按其api描述一样运行。所以我们不得不在某些调度层面作出妥协。
    回复 有任何疑惑可以回复我~ 2019-11-25 21:39:00
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信