Selector
前面兩個(gè)章節(jié)都描述了Buffer和Channel,那這個(gè)章節(jié)就描述NIO三個(gè)最核心部分的最后一塊內(nèi)容 - 選擇器(Selector)
如何使用
在前面的章節(jié)中描述過(guò)多路復(fù)用,一個(gè)線程通過(guò)選擇器處理和管理多個(gè)通道。由此可見(jiàn),選擇器是用來(lái)處理多個(gè)通道并監(jiān)聽(tīng)其通道事件的組件。
Create
只需要調(diào)用 open() 即可創(chuàng)建一個(gè)Selector對(duì)象:Selector selector = Selector.open();
Register
通過(guò) register() 方法注冊(cè)通道:ServerSocketChannel channel = ServerSocketChannel.open(); channel.configureBlocking(false); SelectionKey selectionKey = channel.register(selector, SelectionKey.OP_ACCEPT);
在注冊(cè)通道之前,把通道設(shè)置成非阻塞模式,觀察源碼會(huì)發(fā)現(xiàn) register() 會(huì)校驗(yàn)當(dāng)前通道是否為非阻塞模式,當(dāng)是阻塞模式時(shí),會(huì)拋出IllegalBlockingModeException 異常。在前面一個(gè)章節(jié)也提過(guò),為什么FileChannel沒(méi)有繼承SelectableChannel,因?yàn)樗恍枰嗦窂?fù)用,所以在使用通道的時(shí)候,只有FileChannel不能向選擇器注冊(cè)通道,凡是繼承SelectableChannel都能夠向選擇器注冊(cè)通道。
注冊(cè)通道方法的第二個(gè)參數(shù)是SelectionKey中定義的操作類型,你可以填入任何你感興趣的操作類型,只要這個(gè)通道支持,同樣,在執(zhí)行 register() 方法時(shí)也會(huì)校驗(yàn)該通道是否能夠支持該操作。
注冊(cè)方法同樣也會(huì)返回一個(gè)SelectionKey對(duì)象。Attach Object
注冊(cè)通道的 register() 方法有一個(gè)重載方法,可以向選擇器注冊(cè)通道的時(shí)候,選擇想要帶上的附加對(duì)象:public abstract SelectionKey register(Selector sel, int ops, Object att) throws ClosedChannelException;
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無(wú)線安全]玩轉(zhuǎn)無(wú)線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問(wèn)題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來(lái)看看(二) 2017-07-26