Selector(非同步IO)

來源:互聯網
上載者:User

非同步IO是一種沒有阻塞的讀寫資料的方法,通常,在代碼進行 read() 調用時,代碼會阻塞直至有可供讀取的資料。同樣,write() 調用將會阻塞直至資料能夠寫入。

非同步 I/O 的一個優勢在於,它允許您同時根據大量的輸入和輸出執行 I/O。同步程式常常要求助於輪詢,或者建立許許多多的線程以處理大量的串連。使用非同步 I/O,您可以監聽任何數量的通道上的事件,不用輪詢,也不用額外的線程。

非同步 I/O 中的核心對象名為 Selector。Selector 就是您註冊對各種 I/O 事件的地方,而且當那些事件發生時,就是這個對象告訴您所發生的事件。

第一步:建立一個Selector

       Selector selector = Selector.open();

第二步:開啟一個遠端連線

       InetSocketAddress socketAddress =

new InetSocketAddress("www.baidu.com", 80);

       SocketChannel sc = SocketChannel.open(socketAddress);

       sc.configureBlocking(false);

第三步:選擇鍵,註冊

       SelectionKey key = sc.register(selector, SelectionKey.OP_CONNECT);

註冊時第一個參數總是當前的這個selector。

註冊讀事件:SelectionKey key = sc.register(selector, SelectionKey.OP_READ);

註冊寫事件:SelectionKey key = sc.register(selector, SelectionKey.OP_WRITE);

第四步:內部迴圈處理

int num = selector.select();

Set selectedKeys = selector.selectedKeys();

Iterator it = selectedKeys.iterator();

while (it.hasNext()) {

SelectionKey key = (SelectionKey)it.next();

// ... deal with I/O event ...

}

首先,我們調用 Selector 的 select() 方法。這個方法會阻塞,直到至少有一個登入的事件發生。當一個或者更多的事件發生時, select() 方法將返回所發生的事件的數量。該方法必須首先執行。

接下來,我們調用 Selector 的 selectedKeys() 方法,它返回傳生了事件的 SelectionKey 對象的一個 集合 。

我們通過迭代 SelectionKeys 並依次處理每個 SelectionKey 來處理事件。對於每一個 SelectionKey,您必須確定發生的是什麼 I/O 事件,以及這個事件影響哪些 I/O 對象。

第五步:監聽事件並做出處理

SelectionKey中共定義了四種事件,OP_ACCEPT(socket accept)、OP_CONNECT(socket connect)、OP_READ(read)、OP_WRITE(write)。

第六步:刪除處理過的SelectionKey

在處理 SelectionKey 之後,我們幾乎可以返回主迴圈了。但是我們必須首先將處理過的 SelectionKey 從選定的鍵集合中刪除。

如果我們沒有刪除處理過的鍵,那麼它仍然會在主集合中以一個啟用的鍵出現,這會導致我們嘗試再次處理它。

我們調用迭代器的 remove() 方法來刪除處理過的 SelectionKey:it.remove();

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.