欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2020年07月02日 09:55:46   作者:rickiyang  
這篇文章主要介紹了java NIO之Selector(選擇器)的相關(guān)資料,文中講解非常詳細(xì),實例代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

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

下面我們來使用選擇器:

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

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()方法時, 第二個參數(shù)指定了我們對 Channel 的什么類型的事件感興趣, 這些事件有:

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

一個 Channel發(fā)出一個事件也可以稱為 對于某個事件, Channel 準(zhǔn)備好了. 因此一個 Channel 成功連接到了另一個服務(wù)器也可以被稱為 connect ready.

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

int interestSet = SelectionKey.OP_READ | SelectionKey.OP_WRITE;

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

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

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

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

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

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

選擇器的使用還有很多的細(xì)節(jié),我們應(yīng)該多查看api文檔了解各個方法的用法。下一節(jié)我們做一個綜合練習(xí),總結(jié)一下NIO的使用。

以上就是深入了解java NIO之Selector(選擇器)的詳細(xì)內(nèi)容,更多關(guān)于java nio Selector(選擇器)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 如何使用Comparator比較接口實現(xiàn)ArrayList集合排序

    如何使用Comparator比較接口實現(xiàn)ArrayList集合排序

    這篇文章主要介紹了如何使用Comparator比較接口實現(xiàn)ArrayList集合排序問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java圖形用戶界面之列表框

    Java圖形用戶界面之列表框

    列表框通過Swing組件JList產(chǎn)生,其總是在屏幕上占據(jù)固定行數(shù)的空間。這篇文章主要介紹了java圖形用戶界面之列表框的相關(guān)資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下
    2016-10-10
  • 解決Spring Security的權(quán)限配置不生效問題

    解決Spring Security的權(quán)限配置不生效問題

    這篇文章主要介紹了解決Spring Security的權(quán)限配置不生效問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java開發(fā)學(xué)習(xí)之Bean的作用域和生命周期詳解

    Java開發(fā)學(xué)習(xí)之Bean的作用域和生命周期詳解

    這篇文章主要介紹了淺談Spring中Bean的作用域,生命周期和注解,從創(chuàng)建到消亡的完整過程,例如人從出生到死亡的整個過程就是一個生命周期。本文將通過示例為大家詳細(xì)講講,感興趣的可以學(xué)習(xí)一下
    2022-06-06
  • java日期時間操作工具類

    java日期時間操作工具類

    這篇文章主要為大家詳細(xì)介紹了java日期時間操作工具類,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • SpringBoot+ECharts是如何實現(xiàn)數(shù)據(jù)可視化的

    SpringBoot+ECharts是如何實現(xiàn)數(shù)據(jù)可視化的

    今天帶大家學(xué)習(xí)的是關(guān)于Java的相關(guān)知識,文章圍繞著SpringBoot+ECharts怎么實現(xiàn)數(shù)據(jù)可視化展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • SpringBoot 整合 Lettuce Redis的實現(xiàn)方法

    SpringBoot 整合 Lettuce Redis的實現(xiàn)方法

    這篇文章主要介紹了SpringBoot 整合 Lettuce Redis的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 深度解析Java中ArrayList的使用

    深度解析Java中ArrayList的使用

    ArrayList?類是一個可以動態(tài)修改的數(shù)組,與普通數(shù)組的區(qū)別就是它是沒有固定大小的限制,我們可以添加或刪除元素。本文將通過示例帶你深度解析Java中ArrayList的使用,需要的可以參考一下
    2022-09-09
  • SpringBoot實現(xiàn)郵件推送的詳細(xì)代碼

    SpringBoot實現(xiàn)郵件推送的詳細(xì)代碼

    在項目中經(jīng)常會遇到SpringBoot推送消息的業(yè)務(wù),除了站內(nèi)推送通知,郵件推送也是一種常見的方式,本文小編就帶大家實現(xiàn)郵件推送,文中有詳細(xì)代碼講解,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-04-04
  • Java 之類型轉(zhuǎn)換與多態(tài)詳情

    Java 之類型轉(zhuǎn)換與多態(tài)詳情

    Java使用類創(chuàng)造新的類型(type),并使用繼承來便利我們創(chuàng)建類。再深一層講類型,并是多態(tài)(polymorphism)的概念。本文將給大家介紹Java 的類型轉(zhuǎn)換與多態(tài),需要的小伙伴可以參考下面文章的具體內(nèi)容
    2021-09-09

最新評論