最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

下面我們來使用選擇器:

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

Selector selector = Selector.open();

將 Channel 注冊到選擇器中:

channel.configureBlocking(false);

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

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

注意到, 在使用 Channel.register()方法時(shí), 第二個(gè)參數(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 可寫.

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

我們可以使用或運(yùn)算|來組合多個(gè)事件, 例如:

int interestSet = SelectionKey.OP_READ | SelectionKey.OP_WRITE;

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

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

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

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

下面我們寫一個(gè)完整的例子,看一下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超時(shí),等于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();
    //遍歷已選擇鍵集中的每個(gè)鍵,并檢測各個(gè)鍵所對應(yīng)的通道的就緒事件
    if(key.isAcceptable()) {
      // 連接已經(jīng)被ServerSocketChannel所接受
    } else if (key.isConnectable()) {
      // 連接已經(jīng)被遠(yuǎn)程終止.
    } 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文檔了解各個(gè)方法的用法。下一節(jié)我們做一個(gè)綜合練習(xí),總結(jié)一下NIO的使用。

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

相關(guān)文章

  • Java入門基礎(chǔ)之抽象類與接口

    Java入門基礎(chǔ)之抽象類與接口

    對于面向?qū)ο缶幊虂碚f,抽象是它的一大特征之一,在 Java 中可以通過兩種形式來體現(xiàn)OOP的抽象:接口和抽象類,下面這篇文章主要給大家介紹了關(guān)于Java入門基礎(chǔ)之抽象類與接口的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • 例舉fastJson和jackson轉(zhuǎn)json的區(qū)別

    例舉fastJson和jackson轉(zhuǎn)json的區(qū)別

    今天小編就為大家分享一篇關(guān)于例舉fastJson和jackson轉(zhuǎn)json的區(qū)別,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • SpringBoot在IDEA中實(shí)現(xiàn)熱部署的步驟

    SpringBoot在IDEA中實(shí)現(xiàn)熱部署的步驟

    這篇文章主要介紹了SpringBoot在IDEA中實(shí)現(xiàn)熱部署的步驟,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2020-11-11
  • BeanUtils.copyProperties復(fù)制對象結(jié)果為空的原因分析

    BeanUtils.copyProperties復(fù)制對象結(jié)果為空的原因分析

    這篇文章主要介紹了BeanUtils.copyProperties復(fù)制對象結(jié)果為空的原因分析,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 淺談virtual、abstract方法和靜態(tài)方法、靜態(tài)變量理解

    淺談virtual、abstract方法和靜態(tài)方法、靜態(tài)變量理解

    下面小編就為大家?guī)硪黄獪\談virtual、abstract方法和靜態(tài)方法、靜態(tài)變量理解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • 使用java編程從0到1實(shí)現(xiàn)一個(gè)簡單計(jì)算器

    使用java編程從0到1實(shí)現(xiàn)一個(gè)簡單計(jì)算器

    這篇文章主要介紹了使用java編程從0到1實(shí)現(xiàn)一個(gè)簡單計(jì)算器,文章中用代碼實(shí)例講解的很清晰,有感興趣的同學(xué)可以學(xué)習(xí)研究下
    2021-02-02
  • spring中的注入list集合

    spring中的注入list集合

    這篇文章主要介紹了spring中的注入list集合問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • SpringBoot項(xiàng)目實(shí)戰(zhàn)之加載和讀取資源文件

    SpringBoot項(xiàng)目實(shí)戰(zhàn)之加載和讀取資源文件

    在項(xiàng)目的開發(fā)中,我們知道的是SpringBoot框架大大減少了我們的配置文件,但是還是留下了一個(gè)application.properties文件讓我們可以進(jìn)行一些配置,下面這篇文章主要給大家介紹了關(guān)于SpringBoot項(xiàng)目實(shí)戰(zhàn)之加載和讀取資源文件的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • Java中Jackson快速入門

    Java中Jackson快速入門

    這篇文章主要介紹了Java中Jackson快速入門,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 解決使用mybatis-plus時(shí),生成的SQL大寫變小寫加下劃線問題

    解決使用mybatis-plus時(shí),生成的SQL大寫變小寫加下劃線問題

    這篇文章主要介紹了解決使用mybatis-plus時(shí),生成的SQL大寫變小寫加下劃線問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論

宁晋县| 武强县| 南城县| 盐津县| 林周县| 汤原县| 景德镇市| 琼结县| 潜山县| 保亭| 康平县| 来凤县| 蒲江县| 兴仁县| 溧水县| 四会市| 博兴县| 彰化县| 龙泉市| 景宁| 汝州市| 江都市| 灵宝市| 宝丰县| 威宁| 元江| 广元市| 麟游县| 益阳市| 故城县| 盐津县| 哈巴河县| 腾冲县| 达尔| 化州市| 丰宁| 晋中市| 仪陇县| 巩留县| 诏安县| 乌鲁木齐县|