NIO學習筆記 5 Selector

2021-09-24 16:42:05 字數 1474 閱讀 6032

​ 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...