十、Nio之Selector
阿新 • • 發佈:2019-02-08
通過 Selector 選擇通道
一旦向 Selector 註冊了一或多個通道,就可以呼叫幾個過載的 select()方法。這些方法返回你所感興趣的事件(如連線、接受、讀或寫)已經準備就緒的那些通道。換句話說,如果你對―讀就緒‖的通道感興趣,select()方法會返回讀事件已經就緒的那些通道。
下面是 select()方法:
· int select()
· int select(long timeout)
· int selectNow()
select() 阻塞到至少有一個通道在你註冊的事件上就緒了。
select(long timeout) 和 select()一樣,除了最長會阻塞 timeout 毫秒(引數)。
selectNow() 不會阻塞,不管什麼通道就緒都立刻返回( 此方法執行非阻塞的選擇操作。如果自從前一次選擇操作後,沒有通道變成可選擇的,則此方法直接返回零。 )。
select()方法返回的 int 值表示有多少通道已經就緒。亦即,自上次呼叫 select()方法後有多少通道變成就緒狀態。
如果呼叫 select()方法,因為有一個通道變成就緒狀態,返回了 1,若再次呼叫 select()方法,如果另一個通道就緒
了,它會再次返回 1。如果對第一個就緒的 channel 沒有做任何操作,現在就有兩個就緒的通道,但在每次 select()
方法呼叫之間,只有一個通道就緒了。
selectedKeys()
一旦呼叫了select()方法, 並且返回值表明有一個或更多個通道就緒了, 然後可以通過呼叫selector的selectedKeys()方法,訪問“已選擇鍵集(selected key set)"中的就緒通道。如下所示:
1 Set selectedKeys = selector.selectedKeys();
當像 Selector 註冊 Channel 時,Channel.register()方法會返回一個 SelectionKey 物件。這個物件代表了註冊到該
Selector 的通道。可以通過 SelectionKey 的 selectedKeySet()方法訪問這些物件。
可以遍歷這個已選擇的鍵集合來訪問就緒的通道。如下:
Set selectedKeys = selector.selectedKeys();
Iterator keyIterator = selectedKeys.iterator
while(keyIterator.hasNext()){
SelectionKey key = keyIterator.next();
if(key.isAcceptable()){
// a connection was accepted by a ServerSocketChannel.
}elseif(key.isConnectable()){
// a connection was established with a remote server.
}elseif(key.isReadable()){
// a channel is ready for reading
}elseif(key.isWritable()){
// a channel is ready for writing
}
keyIterator.remove();
}