所謂行文如編程,隨筆比如java文件,文章比如類,參考文獻是import,那麼目錄就是方法定義。html
本篇文章處在分析thrift的nonblocking server以前,由於後者要依賴該篇文章的知識。若兩文同一篇,那便是兩類共享同一文件,其中有一個必爲public,若一文在另外一文中,即爲內部類。按編程規範,仍是分紅兩篇來寫爲好。java
java之NIO詳解系列文章,比較好的,仍是推薦這篇http://tutorials.jenkov.com/java-nio/overview.html。本文只是簡略總結一下。一爲備忘,二爲忘了很快可以拾起。因此遍觀本博所寫,大都勾畫而已,點到即止。因此者何?所謂語言編程,框架工具,異步請求,各類協議,模型演化,參數配置,隨用隨棄,隨拿隨起,翻手爲雲,覆手爲雨,三層以上,存而不議,三層而下,勤勤演習。因此者何?孔子曰:君子不器!編程
上面羅嗦了一番,下面開始進入正題。框架
java NIO主要部件爲Buffer、Channel、Selector。Buffer對應數據,Channel對應鏈接,Selector是全部向其註冊了的Channel的管理器和監控器。異步
與java IO相比,前者(IO)比如直播,後者就是本身播放,能夠前進,能夠後退;前者每一個鏈接的操做都是阻塞的,通常作法是單開一個線程處理一個鏈接,如上一篇的threadpool server的作法,後者能夠一個線程管理多個鏈接,即經過Selector的事件方式管理名下的Channel,把阻塞上移,移到了Selector的select函數中去了。函數
使用Buffer能夠操縱Channel的讀寫,使用Selector能夠監視Channel的事件,下面放一段代碼,其意自明。工具
Selector selector = Selector.open(); channel.configureBlocking(false); SelectionKey key = channel.register(selector, SelectionKey.OP_READ); while(true) { int readyChannels = selector.select(); if(readyChannels == 0) continue; Set<SelectionKey> selectedKeys = selector.selectedKeys(); Iterator<SelectionKey> keyIterator = selectedKeys.iterator(); while(keyIterator.hasNext()) { SelectionKey key = keyIterator.next(); if(key.isAcceptable()) { // a connection was accepted by a ServerSocketChannel. } else if (key.isConnectable()) { // a connection was established with a remote server. } else if (key.isReadable()) { // a channel is ready for reading } else if (key.isWritable()) { // a channel is ready for writing } keyIterator.remove(); } }
跟channel讀寫關聯的比較有用的工具類是Scatter / Gather。能夠一讀多,能夠多寫一。線程
完畢。server