亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

您的位置:首頁技術文章
文章詳情頁

深入了解java NIO之Selector(選擇器)

瀏覽:5日期:2022-08-29 18:28:26

這一節我們將探索選擇器(selectors)。選擇器提供選擇執行已經就緒的任務的能力,這使得多元 I/O 成為可能。就像在第一章中描述的那樣,就緒選擇和多元執行使得單線程能夠有效率地同時管理多個 I/O 通道(channels)。C/C++代碼的工具箱中,許多年前就已經有 select()和 poll()這兩個POSIX(可移植性操作系統接口)系統調用可供使用了。許過操作系統也提供相似的功能,但對Java 程序員來說,就緒選擇功能直到 JDK 1.4 才成為可行的方案。

下面我們來使用選擇器:

通過 Selector.open()方法, 我們可以創建一個選擇器:

Selector selector = Selector.open();

將 Channel 注冊到選擇器中:

channel.configureBlocking(false);SelectionKey key = channel.register(selector, SelectionKey.OP_READ);

注意, 如果一個 Channel 要注冊到 Selector 中, 那么這個 Channel 必須是非阻塞的, 即channel.configureBlocking(false);因為 Channel 必須要是非阻塞的, 因此 FileChannel 不能夠使用選擇器, 因為 FileChannel 都是阻塞的.

注意到, 在使用 Channel.register()方法時, 第二個參數指定了我們對 Channel 的什么類型的事件感興趣, 這些事件有:

Connect, 即連接事件(TCP 連接), 對應于SelectionKey.OP_CONNECT Accept, 即確認事件, 對應于SelectionKey.OP_ACCEPT Read, 即讀事件, 對應于SelectionKey.OP_READ, 表示 buffer 可讀. Write, 即寫事件, 對應于SelectionKey.OP_WRITE, 表示 buffer 可寫.

一個 Channel發出一個事件也可以稱為 對于某個事件, Channel 準備好了. 因此一個 Channel 成功連接到了另一個服務器也可以被稱為 connect ready.

我們可以使用或運算|來組合多個事件, 例如:

int interestSet = SelectionKey.OP_READ | SelectionKey.OP_WRITE;

注意, 一個 Channel 僅僅可以被注冊到一個 Selector 一次, 如果將 Channel 注冊到 Selector 多次, 那么其實就是相當于更新 SelectionKey 的 interest set. 例如:

channel.register(selector, SelectionKey.OP_READ);channel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);

上面的 channel 注冊到同一個 Selector 兩次了, 那么第二次的注冊其實就是相當于更新這個 Channel 的 interest set 為 SelectionKey.OP_READ | SelectionKey.OP_WRITE.

但是Java NIO的selector允許一個單一線程監聽多個channel輸入。我們可以注冊多個channel到selector上,然后然后用一個線程來挑出一個處于可讀或者可寫狀態的channel。selector機制使得單線程管理多個channel變得容易。

下面我們寫一個完整的例子,看一下Selector的用法:

//創建選擇器Selector selector = Selector.open();channel.configureBlocking(false);//注冊通道SelectionKey key = channel.register(selector, SelectionKey.OP_READ);while(true) { //查看selector中的key是否準備好 int readyChannels = selector.select(); //小于0超時,等于0沒準備好,大于0已經準備完畢 if(readyChannels == 0) continue; //獲取選擇器中的key Set<SelectionKey> selectedKeys = selector.selectedKeys(); Iterator<SelectionKey> keyIterator = selectedKeys.iterator(); while(keyIterator.hasNext()) { SelectionKey key = keyIterator.next(); //遍歷已選擇鍵集中的每個鍵,并檢測各個鍵所對應的通道的就緒事件 if(key.isAcceptable()) { // 連接已經被ServerSocketChannel所接受 } else if (key.isConnectable()) { // 連接已經被遠程終止. } else if (key.isReadable()) { // 通道已經準備好讀數據 } else if (key.isWritable()) { // 通道已經準備好寫數據 } keyIterator.remove(); }}

選擇器的使用還有很多的細節,我們應該多查看api文檔了解各個方法的用法。下一節我們做一個綜合練習,總結一下NIO的使用。

以上就是深入了解java NIO之Selector(選擇器)的詳細內容,更多關于java nio Selector(選擇器)的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 国产三级视频在线 | 亚洲欧洲日产国码一级毛片 | 国产精品一久久香蕉国产线看 | 国模肉肉人体大尺度啪啪 | 国产亚洲一区二区手机在线观看 | 极品美女户外勾搭无套 | 韩国美女一级毛片 | 久青草免费在线视频 | 一色屋色费精品视频在线看 | 久久99国产精品亚洲 | 国产伦精品一区二区三区网站 | 欧美成人午夜视频免看 | 亚洲成a人在线观看 | 女人aaaaa片一级一毛片 | 亚洲 欧美 日韩中文字幕一区二区 | 丁香五香天堂 | 亚洲 欧美 日韩 在线 中文字幕 | 成年人毛片 | 一级欧美一级日韩 | 欧美日韩一区二区三区在线观看 | 99视频在线看观免费 | 青青青免费手机版视频在线观看 | 亚洲日本欧美产综合在线 | 天堂男人在线 | 伊人短视频 | 日本亲子乱子伦视频 | 国产香蕉尹人综合在线观 | 精品久久久久久久久久久久久久久 | 在线成人97观看 | 欧美一级在线播放 | 免费一级a毛片免费观看欧美大片 | 97在线国产视频 | 久久久久久久久久久9精品视频 | 欧美三级一级 | 亚洲美女视频网站 | 99国产精品热久久久久久夜夜嗨 | 亚洲男人天堂网站 | 国产亚洲精品成人婷婷久久小说 | 亚洲va老文色欧美黄大片人人 | 99热久久精品国产 | 欧美与黑人午夜性猛交久久久 |