2019-02-21

2019-02-21  本文已影响0人  1b05278ac3b4

v最近JAVA写了一个NIO服务器DEMO,结果老师有问题,一直没找到原因。客户端请求一直没在服务端处理。下面上图:

服务器端代码 处理器代码

上面的代码看上去没啥问题,但是运行的时候一请求就没有返回,后来发现时用为在handleAccept方法里面调用了register方法。

handleAccept方法代码

由于selector.select(3000)会锁定 select对象中的publicKeys


socket.register(selector,SelectionKey.OP_READ) 方法在执行时也会获取同步锁 publicKeys[图片上传中...(image.png-b53fb-1550740002748-0)] image.png

由于上面时用的同一个selector而在处理事件的时候又使用了多线程,所以会导致RequestHandler还没有执行register的时候 Server程序又执行到了selector.select(),从而导致register的时候由于等待publicKeys锁而无法完成OP_READ(可读事件)的注册。从而无法收到消息。

handleAccept 如果时多线程就会出现上面的问题。

上一篇 下一篇

猜你喜欢

热点阅读