、前言

  前面已經(jīng)學(xué)習(xí)了緩沖和通道,接著學(xué)習(xí)選擇器。

二、選擇器

  2.1 選擇器基礎(chǔ)

  選擇器管理一個(gè)被注冊(cè)的通道集合的信息和它們的就緒狀態(tài),通道和選擇器一起被注冊(cè),并且選擇器可更新通道的就緒狀態(tài),也可將被喚醒的線程掛起,直到有通道就緒。

  SelectableChannel 可被注冊(cè)到 Selector 對(duì)象上,同時(shí)可以指定對(duì)那個(gè)選擇器而言,哪種操作是感興趣的。一個(gè)通道可以被注冊(cè)到多個(gè)選擇器上,但對(duì)每個(gè)選擇器而言,只能被注冊(cè)一次,通道在被注冊(cè)到一個(gè)選擇器上之前,必須先設(shè)置為非阻塞模式,通過(guò)調(diào)用通道的configureBlocking(false)方法即可。這意味著不能將FileChannel與Selector一起使用,因?yàn)镕ileChannel不能切換到非阻塞模式,而套接字通道都可以。

  選擇鍵封裝了特定的通道與特定的選擇器的注冊(cè)關(guān)系,選擇鍵對(duì)象被SelectableChannel.register( ) 方法返回并提供一個(gè)表示這種注冊(cè)關(guān)系的標(biāo)記。選擇鍵包含了兩個(gè)比特集(以整數(shù)的形式進(jìn)行編碼),指示了該注冊(cè)關(guān)系所關(guān)心的通道操作及通道已經(jīng)準(zhǔn)備好的操作。

  如下代碼演示了通道與選擇器之間的關(guān)系 

iOS培訓(xùn),Swift培訓(xùn),蘋(píng)果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

Selector selector = Selector.open( );
channel1.register (selector, SelectionKey.OP_READ);
channel2.register (selector, SelectionKey.OP_WRITE);
channel3.register (selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);// Wait up to 10 seconds for a channel to become readyreadyCount = selector.select (10000);

iOS培訓(xùn),Swift培訓(xùn),蘋(píng)果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

  三個(gè)通道注冊(cè)到了選擇器上,并且感興趣的操作各不相同,select( )方法在將線程置于睡眠狀態(tài),直到感興趣的操作中的一個(gè)發(fā)生或者等待10秒鐘的時(shí)間。

  現(xiàn)有的可選操作有讀(read),寫(xiě)(write

網(wǎng)友評(píng)論