Java之IO學習 五 NIO選擇器

2021-08-30 13:25:14 字數 1774 閱讀 1055

內容:

nio稱為非阻塞io,實現了io的多路復用中的reactor模型,乙個執行緒thread使用選擇器selector通過輪詢的方式監聽

多個通道(channel)。因為建立和切換執行緒的開銷很大,因此使用乙個執行緒來處理多個事件而不是乙個執行緒處理乙個事件,對於 io 密集型的應用具有很好地效能。

套接字通道必須為非阻塞的。(filechannel為非阻塞的)

selector selector = selector.open();
serversocketchannel sschannel = serversocketchannel.open();

sschannel.configureblocking(false);

sschannel.register(selector, selectionkey.op_accept);

通道必須為非阻塞通道!

在將通道註冊到選擇器上時,還需要指定要註冊的具體事件,主要有以下幾類:

selectionkey 的定義如下:

public static final int op_read = 1 << 0;

public static final int op_write = 1 << 2;

public static final int op_connect = 1 << 3;

public static final int op_accept = 1 << 4;

可以看出每個事件可以被當成乙個位域,從而組成事件集整數。例如:

int interestset = selectionkey.op_read | selectionkey.op_write;
int num = selector.select();
setkeys = selector.selectedkeys();

iteratorkeyiterator = keys.iterator();

while (keyiterator.hasnext()) else if (key.isreadable())

keyiterator.remove();

}

因為一次 select() 呼叫不能處理完所有的事件,並且伺服器端有可能需要一直監聽事件,因此伺服器端處理事件的**一般會放在乙個死迴圈內。

while (true)  else if (key.isreadable()) 

keyiterator.remove();}}

public class nioserver  else if (key.isreadable()) 

keyiterator.remove();}}

}private static string readdatafromsocketchannel(socketchannel schannel) throws ioexception

buffer.flip();

int limit = buffer.limit();

char dst = new char[limit];

for (int i = 0; i < limit; i++)

buffer.clear();

}return data.tostring();}}

IO模型之NIO快速理解

什麼是nio?nio是乙個非阻塞的就是說,他在accept 的時候不會阻塞,在read 的時候也不會阻塞,和之前的bio不同。假設有一萬個連線,如果是bio那核心就必須丟擲1萬個執行緒去處理,但是nio確不用,他可能只需要幾百個就行。為什麼nio可以做到這樣呢?是因為nio的3大核心。nio non...

java學習之IO流2

讀取鍵盤輸入 示例1 下圖中第3行建立位元組讀取流物件,獲取鍵盤讀取流system.in。第4行使用位元組讀取流的read 方法來讀鍵盤資料。第5行進行輸出。private static void readkey1 throws ioexception 示例2 下圖中使用迴圈讀取鍵盤輸入的資料。當鍵...

java之IO流學習(三)

這兩個哥們也生了好多崽,操作檔案嘛,當然就有fileinputstream和fileoutputstream了,如何更加的高效呢,包裝一下吧,裝個逼,bufferedinputstream和bufferedoutputstream。public static void main string arg...