select()阻塞到至少有一个通道在你注册的事件上就绪了。
这句话什么意思?
哪位大神给解释下!
select()阻塞到至少有一个通道在你注册的事件上就绪了。
这句话什么意思?
哪位大神给解释下!
这个是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的,就是阻塞多长时间直接,就不阻塞了。
就是所谓的,天涯何处无芳草,何必一直等那个人呢。我给你一个期限,如果你来了,那么我就返回,如果到时间你都没来,那我就走吧。
双十一,快乐