代码之家  ›  专栏  ›  技术社区  ›  qweruiop

在select.selete()之后,selectedKeys()返回空

  •  1
  • qweruiop  · 技术社区  · 11 年前

    在使用Java NIO时,我遇到了一些问题。

    我需要 更改 interestOps key 。我发现这里有两种方法。

    第一 通过调用 key.interestOps() :

    key.interestOps(OP_READ)
    

    然而,我遇到了一个非常棘手的问题 线程安全 问题如下:

    key.interestOps(OP_WRITE);
    sl.select();  
    Iterator iter = sl.selectedKeys().iterator();
    log(iter.toArray().length); // Sometimes, I got 0 here!
    

    有趣的是,我有时在日志中得到0(但有时效果很好)。但在其他线程中并没有显式修改键。我不明白 line2 line3 .

    另一个 方法是 register 再一次:

    问题是新退货 钥匙 失去缓冲:

    key = sockChannel.register(selector, OP_WRITE);
    key.attach(buf);
    sockChannel.register(selector, OP_READ);
    key.attachment();// nullExcetion here!
    

    当然,这可以通过重新分配缓冲区来解决,但我相信情况会更好。

    有什么见解吗?

    1 回复  |  直到 11 年前
        1
  •  -1
  •   qweruiop    11 年前

    我应该说Java NIO中的线程安全问题非常棘手。与其想清楚,不如避开它。这就是作者所倡导的哲学 Rox Java NIO教程 http://rox-xmlrpc.sourceforge.net/niotut/ ,这是一个很好的NIO新手教程。很多技巧和原则都非常有用。我个人会向所有想深入研究Java NIO的人推荐本教程。读一读,你可以学到很多东西。