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

相关文章
相关标签/搜索