返回列表 发帖

[疯狂Java讲义] NIO中Selector问题请教

在《疯狂java讲义》第823面
讲NIO的相关知识时
有如下描述
  1. 一个Selector实例有3个SelectionKey集合
  2. 所有SelectionKey集合:selectedKeys()返回是被选择需要进行io处理的Channel.
  3. 被选择的SelectionKey集合:keys()方法返回则是所有注册在该Selector()上的Channel
  4. 被取消的SelectionKey集合:略
复制代码
我想请教一个问题,
如果说 被选择的SelectionKey集合 中有某个Channel 被执行
selector.selectedKeys().remove(sk);
那么在
所有SelectionKey集合 中还有 该Channel  吗?


换句话说,在这里

被选择的SelectionKey集合 所有SelectionKey集合
两者之间是 并列关系 还是 包含关系


(根据我对该书第825页的代码分析,应该是并列关系,也说是说,虽然 被选择的SelectionKey集合 中的 某个
Channel
remove了,那么在 所有SelectionKey集合 中还是存在该Channel了)


[ 本帖最后由 crazyit 于 2010-4-13 00:15 编辑 ]

提问赏金:6金币
获奖名单 : kongyeeku(6金币)    
成功的人不是赢在起点,而是赢在转折点!

成功的人不是赢在起点,而是赢在转折点!

TOP

这是一个很好的问题啊。。非常希望站长,能对
  1. selector.selectedKeys().remove(sk);
复制代码
这个语句,在上述代码中的作用讲解一下,用这句倒底是起什么作用?。。我刚才测试,发现注释掉这一句后,
如下这句
  1. sc.configureBlocking(false);
复制代码
会报NULLPOINTOR错务
成功的人不是赢在起点,而是赢在转折点!

TOP

成功的人不是赢在起点,而是赢在转折点!

TOP

回复 1# crazyit

这么奇怪?
我看到书上写的是:

        所有SelectionKey集合:代表了注册在该Selector上的Channel,这个集合可以通过keys()方法返回。
        被选择的SelectionKey集合:代表了所有可通过select()方法获取的、需要进行IO处理的Channel,这个集合可以通过selectedKeys()返回。
        被取消的SelectionKey集合:

从这个描述不难看出:

所有SelectionKey集合的范围 > 被选择的SelectionKey集合. (也就是说应该是包含关系啊)

程序通过遍历 “被选择的SelectionKey集合”  即可得到那些需要进行IO处理的Channel。

TOP

返回列表