1. 程式人生 > >Java NIO教程(六)Selector

Java NIO教程(六)Selector

                                 Java NIO教程(六)Selector

Selector(選擇器)是Java NIO中能夠檢測一到多個NIO通道,並能夠知曉通道是否為諸如讀寫事件做好準備的元件。這樣,一個單獨的執行緒可以管理多個channel,從而管理多個網路連線。


為什麼使用Selector?

僅用單個執行緒來處理多個Channels的好處是,只需要更少的執行緒來處理通道。事實上,可以只用一個執行緒處理所有的通道。對於作業系統來說,執行緒之間上下文切換的開銷很大,而且每個執行緒都要佔用系統的一些資源(如記憶體)。因此,使用的執行緒越少越好。

但是,需要記住,現代的作業系統和CPU在多工方面表現的越來越好,所以多執行緒的開銷隨著時間的推移,變得越來越小了。實際上,如果一個CPU有多個核心,不使用多工可能是在浪費CPU能力。不管怎麼說,關於那種設計的討論應該放在另一篇不同的文章中。在這裡,只要知道使用Selector能夠處理多個通道就足夠了。

下面是單執行緒使用一個Selector處理3個channel的示例圖:

Selector的建立

通過呼叫Selector.open()方法建立一個Selector,如下:

1 Selector selector = Selector.open();

向Selector註冊通道

為了將Channel和Selector配合使用,必須將channel註冊到selector上。通過SelectableChannel.register()方法來實現,如下:

1 channel.configureBlocking(false);
2 SelectionKey key = channel.register(selector,
3     Selectionkey.OP_READ);

與Selector一起使用時,Channel必須處於非阻塞模式下。這意味著不能將FileChannel與Selector一起使用,因為FileChannel不能切換到非阻塞模式。而套接字通道都可以。

注意register()方法的第二個引數。這是一個“interest集合”,意思是在通過Selector監聽Channel時對什麼事件感興趣。可以監聽四種不同型別的事件:

  1. Connect
  2. Accept
  3. Read
  4. Write

通道觸發了一個事件意思是該事件已經就緒。所以,某個channel成功連線到另一個伺服器稱為“連線就緒”。一個server socket channel準備好接收新進入的連線稱為“接收就緒”。一個有資料可讀的通道可以說是“讀就緒”。等待寫資料的通道可以說是“寫就緒”。

這四種事件用SelectionKey的四個常量來表示:

  1. SelectionKey.OP_CONNECT
  2. SelectionKey.OP_ACCEPT
  3. SelectionKey.OP_READ
  4. SelectionKey.OP_WRITE

如果你對不止一種事件感興趣,那麼可以用“位或”操作符將常量連線起來,如下:

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

在下面還會繼續提到interest集合。

SelectionKey

在上一小節中,當向Selector註冊Channel時,register()方法會返回一個SelectionKey物件。這個物件包含了一些你感興趣的屬性:

  • interest集合
  • ready集合
  • Channel
  • Selector
  • 附加的物件(可選)

下面我會描述這些屬性。

interest集合

就像向Selector註冊通道一節中所描述的,interest集合是你所選擇的感興趣的事件集合。可以通過SelectionKey讀寫interest集合,像這樣:

1 int interestSet = selectionKey.interestOps();
2
3 boolean isInterestedInAccept  = (interestSet & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT;
4 boolean isInterestedInConnect = interestSet & SelectionKey.OP_CONNECT;
5 boolean isInterestedInRead    = interestSet & SelectionKey.OP_READ;
6 boolean isInterestedInWrite   = interestSet & SelectionKey.OP_WRITE;

可以看到,用“位與”操作interest 集合和給定的SelectionKey常量,可以確定某個確定的事件是否在interest 集合中。

ready集合

ready 集合是通道已經準備就緒的操作的集合。在一次選擇(Selection)之後,你會首先訪問這個ready set。Selection將在下一小節進行解釋。可以這樣訪問ready集合:

1 int readySet = selectionKey.readyOps();

可以用像檢測interest集合那樣的方法,來檢測channel中什麼事件或操作已經就緒。但是,也可以使用以下四個方法,它們都會返回一個布林型別:

相關推薦

Java NIO教程Selector

                                 Java NIO教程(六)Selector Selec

Java NIO系列教程 Selector

原文連結 作者:Jakob Jenkov 譯者:浪跡v 校對:丁一 Selector(選擇器)是Java NIO中能夠檢測一到多個NIO通道,並能夠知曉通道是否為諸如讀寫事件做好準備的元件。這樣,一個單獨的執行緒可以管理多個channel,從而管理多個網路連線。 下面是本文所涉及到的主題列表:

Java NIO教程 通道之間的資料傳輸

                                 Java NIO教程(五) 通道之間的資料傳輸

Java NIO教程 Scatter & Gather

                                    Java NIO教程(四) Scatter &

Java NIO教程 Buffer

                                          Ja

Java NIO教程 Channel

                                       Java NIO教程

Java NIO教程 核心概述

Java NIO教程(一)  核心概述  Java NIO 由以下幾個核心部分組成: Channels Buffers Selectors 雖然Java NIO 中除此之外還有很多類和元件,但在我看來,Channel,Buffer 和 Selec

jmeter教程java請求

我們傳送http請求或是其它請求,就是在執行一段程式碼,只不過,執行的程式碼,佈署在伺服器上。而java請求,也是在執行一段程式碼,只不過程式碼佈署在本地,需要我們自己實現程式碼的邏輯。利用java請求,可以很方便地實現你想要的需求,當然,前提是你要會java。先看看java請求的具體實現吧,開啟e

【selenium3+JAVA】介面自動化測試教程——元素查詢和操作

一、前言 元素查詢為selenium的基礎操作,基本上大部分操作都是基於元素的,故此部分為必須掌握內容,方法包括通過名稱、id、tagName、xpath等方法,下面會詳細介紹這些方法; 二、元素查詢 下面一一介紹這些方法,無論哪種查詢方式,記得都應該在網站的開

CentOS7配置教程安裝Maven和建立Java專案、執行專案

一、安裝 前提:需要安裝好jdk 1、下載安裝檔案 在任何目錄下執行如下命令: 2、解壓安裝 tar -zxvf apache-maven-3.3.9-bin.tar.gz  mv apache-maven-3.3.9 maven-3.3.9 3、配置環境變

Java NIO介紹————無堵塞io和Selector簡單介紹

無堵塞IO介紹 既然NIO相比於原來的IO在讀取速度上其實並沒有太大區別(因為NIO出來後,IO的低層已經以NIO為基礎重新實現了),那麼NIO的優點是什麼呢? NIO是一種同步非阻塞的I/O模型,也是I/O多路複用的基礎,而且已經被越來越多地應用到大型應用伺服器,成為解決

NIOselector和channel的使用

什麼是NIO? 執行緒在處理資料時,如果執行緒還處於將資料從channel讀到buffer的這段時間內,執行緒可以去做別的事情,等資料都讀到buffer了,執行緒再回來處理讀到的資料 channel是什麼? 類比流的概念。與流的區別在於 channel是可讀可寫的,但是一個流要

Java NIO總結:Channel、Buffer、Selector

0. 概述 NIO的全稱是NoneBlocking IO,非阻塞IO,區別於BIO,BIO的全稱是Blocking IO,阻塞IO。那這個阻塞是什麼意思呢?例如傳統的多執行緒伺服器是BlockingIO模式的,從頭到尾所有的執行緒都是阻塞的,接收請求和處

java設計模式策略模式

() pan win with blog trac java設計模式 ring ide   策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們可以相互替換,讓算法獨立於使用它的客戶而獨立變化,具體應用場景如第三方支付對接不同銀行的算法。   要點:1)抽象策略角

Spring Boot參考教程Spring Boot配置Servlet,Filter,Listener,Interceptor

cat http list err oot (六) water iter fontsize 4.2.5. Spring Boot配置Servlet,Filter,Listener,Interceptor 1. 配置Servlet 在開發中一些場景常會使用到servlet

java學習筆記:變量類型

animal 單獨使用 div 位置 fin strong pub 局部變量 變量聲明 java一共三種變量: 局部變量(本地變量):方法調用時創建,方法結束時銷毀 實例變量(全局變量):類創建時創建,類銷毀時銷毀 類變量(靜態變量):程序啟動是創建,程序銷毀時銷毀

Linux系列教程——Linux文件搜索命令

www. 講解 -i linux鏈接 /tmp 任務 html 幫助文檔 大於   前一篇博客我們講解了Linux鏈接命令和權限管理命令, 通過 ln -s 鏈接名 表示創建軟鏈接,不加-s表示創建硬鏈接;還有三個更改權限的命令,chmod命令可以更改文件或目錄權限,ch

Java基礎學習 網絡編程簡介

exc 個數 intern 時間 能夠 兩臺 接受 void connect 基礎知識:1、osi分層模型和TCP/IP分層模型對應關系 2、七層模型與協議的對應關系 網絡層 ------------ IP(網絡之間的互聯協議) 傳

Java開發筆記特殊數字的表達

world 表達 int 數據 decimal stat java語言 細節 進制數 之前的文章提到,Java語言不但支持大眾熟知的十進制數,也支持計算機特有的二進制數、八進制數和十六進制數。可是在給數值變量賦值的時候,等號右邊的數字明顯屬於十進制,那究竟要如何書寫其它進制

NeuChar 平臺使用及開發教程:成為開發者

  在上一篇《NeuChar 平臺使用及開發教程(五):使用 NeuChar 的關鍵字回覆服務》中,我們已經學習瞭如何命中關鍵字來反饋特定格式內容的資訊,這是由微信開發者/運營者自己來維護的資訊,那麼如果我們自己有微信開發的經驗,並且想要把這個能力釋放出來,為其他的公眾號,甚至小程式、釘釘等平臺提供服務,我們