selector是怎樣檢查有沒有就緒事件的?答:每個request會封裝一個channel骨杂,將所有的channel注冊在一個Selector上,然后selector開始不斷的輪詢每個request的可讀狀態(tài),如果可讀,則直接返回可讀狀態(tài)的channel
下面是select()方法:
int select()
int select(long timeout)
int selectNow()
select()阻塞到至少有一個通道在你注冊的事件上就緒了允坚。
select(long timeout)和select()一樣,除了最長會阻塞timeout毫秒(參數(shù))悲龟。
selectNow()不會阻塞屋讶,不管什么通道就緒都立刻返回(譯者注:此方法執(zhí)行非阻塞的選擇操作冰寻。如果自從前一次選擇操作后须教,沒有通道變成可選擇的,則此方法直接返回零。)轻腺。
select()方法返回的int值表示有多少通道已經(jīng)就緒乐疆。亦即,自上次調(diào)用select()方法后有多少通道變成就緒狀態(tài)贬养。如果調(diào)用select()方法,因為有一個通道變成就緒狀態(tài),返回了1辫秧,若再次調(diào)用select()方法担锤,如果另一個通道就緒了,它會再次返回1儿礼。如果對第一個就緒的channel沒有做任何操作咖杂,現(xiàn)在就有兩個就緒的通道,但在每次select()方法調(diào)用之間蚊夫,只有一個通道就緒了诉字。