美文网首页
2019-02-21

2019-02-21

作者: 1b05278ac3b4 | 来源:发表于2019-02-21 17:12 被阅读0次

    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 如果时多线程就会出现上面的问题。

    相关文章

      网友评论

          本文标题:2019-02-21

          本文链接:https://www.haomeiwen.com/subject/ixldyqtx.html