91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中NIO之Selector是什么

發布時間:2020-07-02 14:40:04 來源:億速云 閱讀:130 作者:清晨 欄目:開發技術

小編給大家分享一下java中NIO之Selector是什么,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討方法吧!

這一節我們將探索選擇器(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();
  }
}

看完了這篇文章,相信你對java中NIO之Selector是什么有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

敦化市| 安康市| 宁国市| 宽城| 彝良县| 西青区| 高州市| 奉化市| 塔城市| 林州市| 海安县| 喀什市| 瓦房店市| 融水| 北宁市| 武鸣县| 灵武市| 阿尔山市| 泌阳县| 宁阳县| 周至县| 民和| 万全县| 江华| 元氏县| 丰台区| 陆丰市| 深州市| 县级市| 汉源县| 界首市| 忻州市| 铜梁县| 南平市| 永德县| 丹阳市| 偏关县| 建德市| 美姑县| 孟连| 霍林郭勒市|