、前言
前面已經(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)系
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);
三個(gè)通道注冊(cè)到了選擇器上,并且感興趣的操作各不相同,select( )方法在將線程置于睡眠狀態(tài),直到感興趣的操作中的一個(gè)發(fā)生或者等待10秒鐘的時(shí)間。
現(xiàn)有的可選操作有讀(read),寫(xiě)(write