selector 允許乙個單一的執行緒來操作多個 channel. 如果我們的應用程式中使用了多個 channel, 那麼使用 selector 很方便的實現這樣的目的, 但是因為在乙個執行緒中使用了多個 channel, 因此也會造成了每個 channel 傳輸效率的降低.為了使用 selector, 我們首先需要將 channel 註冊到 selector 中, 隨後呼叫 selector 的 select()方法, 這個方法會阻塞, 直到註冊在 selector 中的 channel 傳送可讀寫事件. 當這個方法返回後, 當前的這個執行緒就可以處理 channel 的事件了.
**:例項:
public
class
selectortest
// 死迴圈,保證伺服器一直開啟
while
(true
)else
if(key.
isreadable()
) bytebuffer.
flip()
; channel.
write
(bytebuffer)
; byteread += read;
} system.out.
println
("讀取"
+ byteread +
", 來自"
+ channel)
; iterator.
remove()
;// selector.close();}}}}}
上訴**需要注意的是:
selector selector = selector.
open()
;
serversocketchannel.
configureblocking
(false);
socketchannel.
register
(selector, selectionkey.op_read)
;
selectionkey的四種狀態selectionkey.op_connect //某個channel成功連線到另乙個伺服器稱為「連線就緒」
selectionkey.op_accept //乙個server socket channel準備好接收新進入的連線稱為「接收就緒」。
selectionkey.op_read //乙個有資料可讀的通道可以說是「讀就緒」。
selectionkey.op_write // 等待寫資料的通道可以說是「寫就緒」。
監聽結束一定要刪除
iterator.remove();
NIO學習筆記四
第一行使用bytebuffer的靜態方法allocate 來分配緩衝區,函式引數指定了緩衝區的大小。第三行是將現有的陣列轉成緩衝區,通過靜態方法wrap 引數為現有的陣列。bytebuffer buffer bytebuffer.allocate 1024 byte array new byte 1...
NIO學習筆記二 Channels
這一章主要是對nio的channels進行說明。1 channels與io stream的區別。主要區別如下 2 channel 主要實現。主要實現類如下 3 channel 的簡單例子。以下是使用channel讀取檔案內容的簡單例子 public static void readfile stri...
NIO學習筆記之緩衝區Buffer
buffer有四個屬性 1 capacit 容量 2 limit 上界 3 position 位置 4 mark 標記 絕對儲存不會影響緩衝區的位置屬性 存和取的方法 public abstract byte get public abstract byte get int index public...