一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|

服務器之家 - 編程語言 - JAVA教程 - 深入了解java NIO之Selector(選擇器)

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

2020-07-02 12:08rickiyang JAVA教程

這篇文章主要介紹了java NIO之Selector(選擇器)的相關(guān)資料,文中講解非常詳細,實例代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下

這一節(jié)我們將探索選擇器(selectors)。選擇器提供選擇執(zhí)行已經(jīng)就緒的任務的能力,這使得多元 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)建一個選擇器:

java" id="highlighter_932122">
?
1
Selector selector = Selector.open();

將 Channel 注冊到選擇器中:

?
1
2
3
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 連接), 對應于SelectionKey.OP_CONNECT
  • Accept, 即確認事件, 對應于SelectionKey.OP_ACCEPT
  • Read, 即讀事件, 對應于SelectionKey.OP_READ, 表示 buffer 可讀.
  • Write, 即寫事件, 對應于SelectionKey.OP_WRITE, 表示 buffer 可寫.

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

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

?
1
int interestSet = SelectionKey.OP_READ | SelectionKey.OP_WRITE;

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

?
1
2
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允許一個單一線程監(jiān)聽多個channel輸入。我們可以注冊多個channel到selector上,然后然后用一個線程來挑出一個處于可讀或者可寫狀態(tài)的channel。selector機制使得單線程管理多個channel變得容易。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//創(chuàng)建選擇器
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已經(jīng)準備完畢
  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()) {
      // 連接已經(jīng)被ServerSocketChannel所接受
    } else if (key.isConnectable()) {
      // 連接已經(jīng)被遠程終止.
    } else if (key.isReadable()) {
      // 通道已經(jīng)準備好讀數(shù)據(jù)
    } else if (key.isWritable()) {
      // 通道已經(jīng)準備好寫數(shù)據(jù)
    }
    keyIterator.remove();
  }
}

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

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

原文鏈接:https://www.cnblogs.com/rickiyang/p/11074240.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: tk白嫩玉足脚心vk | 美女逼逼软件 | 色伦网 | free性丰满hd性欧美人体 | videos变态极端 | 女人麻豆国产香蕉久久精品 | 大陆国产vs国产对白 | 精品国产无限资源免费观看 | 超级乱淫伦小说全集np | 精品国产成a人在线观看 | 国产精品一区二区三区免费视频 | 91大神在线精品播放 | 洗濯屋H纯肉动漫在线观看 武侠艳妇屈辱的张开双腿 午夜在线观看免费观看 视频 | 女人是男人的未来1分49分 | 国产全部理论片线观看 | 亚洲不卡视频在线 | 短篇最污的乱淫伦小说全集 | 免费超级乱淫视频播放性 | 无遮无挡免费视频 | 艹逼的视频| 色综合色狠狠天天综合色 | 驯服有夫之妇HD中字日本 | 国产成人在线影院 | 国产精品欧美亚洲韩国日本99 | 亚洲一级视频在线观看 | 憋尿调教绝望之岛 | 亚洲 欧美 国产 综合久久 | 日韩国产欧美一区二区三区 | 黑人与欧洲女子性大战 | 国产成人小视频在线观看 | 91制片厂制作传媒免费版樱花 | 亚洲男女在线 | 饭冈加奈子在线播放观看 | 国自产精品手机在线视频 | 欧美视频网址 | 四虎影院网址大全 | 91精品91久久久久久 | 国产精品亚洲午夜一区二区三区 | 春宵福利网站在线观看 | 国产精品福利短视在线播放频 | 草草视频免费看 |