CSDNRGY
2016-11-11 06:11
采纳率: 99.3%
浏览 2.3k
已采纳

java的Selector的select是什么意思?

select()阻塞到至少有一个通道在你注册的事件上就绪了。

这句话什么意思?
哪位大神给解释下!

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • Readiay 2016-11-11 06:39
    已采纳

    这个是java的一个NIO里面的东东。传统的模式下,硬盘读写的速度太慢了,而cpu处理的速度很快,
    如果同步的方式就导致cpu在等待IO完成,也就是阻塞在IO上。导致的结果就是一个线程在很长的时间上并不是一直在运行,而是在等待。
    如果第二个任务来了,就要在创建一个线程,结果就是两个线程等待,其实可以优化下,就是使用一个线程,当这个任务阻塞在iO上的时候,
    就去处理另外一个任务。这个就是NIO的想法。大致原理就是去饭店吃饭一样的。
    很多时候我们去饭店吃饭只是点餐的时候用到了服务员,吃的时候不需要服务员。如果来一个客人就分配一个服务员,很亏。这个就是传统阻塞IO的现状。
    NIO就是找一个人负责接待,这个人记录了所有的客人的相关信息,过一段时间这个人就看看饭店里面需要用到服务员的人有哪些,然后给他分配一个服务员。
    其实可能10桌客人只有2桌需要,其他8桌都在吃饭。于是本来需要10个人的,现在只要3个就行了,一个负责查看谁需要服务,然后两个负责提供服务。

    Selector就是那个接待的人(or结尾,英语里面就是表示什么什么人,例如actor),每次客户端连接进来就记录下这个客户端信息,然后调用select()方法的时候,就阻塞了,等待客户端的输入。
    当某一个客户端符合某种特性的时候,select()方法就能把符合这种特性的客户端找出来,这种某种特性就是事件。简单来说就是你对什么事件关心,
    你就注册这种事件,如果客户端符合这种事件,select就能找出来。
    这四种事件用SelectionKey的四个常量来表示:

    SelectionKey.OP_CONNECT
    SelectionKey.OP_ACCEPT
    SelectionKey.OP_READ
    SelectionKey.OP_WRITE

    但是有时候服务会空闲下来,就是很长世间没人连接进来,如果select()就等啊等啊等,阻塞在哪里了,直到有一天客户端连接进来了,

    所以说:阻塞到至少有一个通道在你注册的事件上就绪。
    说简单就是:阻塞到至少有一个客户端满足了条件。

    select还有其他重载的方法,有个就是带参数long的,就是阻塞多长时间直接,就不阻塞了。
    就是所谓的,天涯何处无芳草,何必一直等那个人呢。我给你一个期限,如果你来了,那么我就返回,如果到时间你都没来,那我就走吧。

    双十一,快乐

    6 打赏 评论

相关推荐 更多相似问题