采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
您好老师,12-2这里优化以后: 会出现下图的问题: 导致消息直接通过channel写出去了,不会去注册。这个在发送稍微大一点的文件的时候,会一直循环执行processor.onConsumeCompleted(args);会出现下图的情况:
StackOverflowError
从你的调用链来看,的确是出现了递归循环,导致你的栈不够。
建议检查一下这几个方法内部实现,看看是不是出现了递归调用的情况。看你的日志来说是这几个方法一直处于循环状态,如果在一个线程中一直这样就会出现你的问题,你需要看看在requestSend操作中是否真的将Callback交给了线程去再次调度,还是自己就执行了。
从你的代码来看的确是这里再次执行了,并未交给线程去再次调度。而课程优化,我记得是尝试发送,如果发送后还有则进行二次调度。你可以往课程后面继续看看。
您好,老师。图中的代码是老师12-2优化后的代码,是因为我自己的代码出现了这个问题,所以使用老师的代码测了一下,也出现了同样的问题。想了一下,不知道对不对,java nio是水平触发的,所以只要缓冲区还不满,写事件就会一直就绪。所以老师在此节中说的注册过程(提问中第二张图的红框部分)是不会执行的,因为args每次都可以写入数据到channel当中,所以此时整个写的调度过程都只在同一个线程。
老师在后续的代码中修复了这个问题,这里只针对12-2优化的代码
嗯嗯,看了当时的代码的确是有这个问题。其实很大程度是因为nio的底层实现其实是有bug的。之前我测试nio的调度,发现有些步骤并未按其api描述一样运行。所以我们不得不在某些调度层面作出妥协。
登录后可查看更多问答,登录/注册
理论+实践,系统且深入掌握Socket核心技术,从容应对各种Socket应用场景的不二之选
2.5k 1
1.6k 7
1.5k 5
1.7k 13
892 13