java之NIO編程

所謂行文如編程,隨筆比如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

相關文章
相關標籤/搜索