、前言
前面已經(jīng)學習了緩沖和通道,接著學習選擇器。
二、選擇器
2.1 選擇器基礎
選擇器管理一個被注冊的通道集合的信息和它們的就緒狀態(tài),通道和選擇器一起被注冊,并且選擇器可更新通道的就緒狀態(tài),也可將被喚醒的線程掛起,直到有通道就緒。
SelectableChannel 可被注冊到 Selector 對象上,同時可以指定對那個選擇器而言,哪種操作是感興趣的。一個通道可以被注冊到多個選擇器上,但對每個選擇器而言,只能被注冊一次,通道在被注冊到一個選擇器上之前,必須先設置為非阻塞模式,通過調(diào)用通道的configureBlocking(false)方法即可。這意味著不能將FileChannel與Selector一起使用,因為FileChannel不能切換到非阻塞模式,而套接字通道都可以。
選擇鍵封裝了特定的通道與特定的選擇器的注冊關系,選擇鍵對象被SelectableChannel.register( ) 方法返回并提供一個表示這種注冊關系的標記。選擇鍵包含了兩個比特集(以整數(shù)的形式進行編碼),指示了該注冊關系所關心的通道操作及通道已經(jīng)準備好的操作。
如下代碼演示了通道與選擇器之間的關系
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);
三個通道注冊到了選擇器上,并且感興趣的操作各不相同,select( )方法在將線程置于睡眠狀態(tài),直到感興趣的操作中的一個發(fā)生或者等待10秒鐘的時間。
現(xiàn)有的可選操作有讀(read),寫(write