java.nio.channels 中的接口和类。

 A channel represents an open connection to an entity such as a hardware device, a file, a network socket, or a program component that is capable of performing one or more distinct I/O operations, for example reading or writing.
  channel就是一个打开的连接向一个实体的连接,这些实体包括硬件设备,文件,网络socket或者程序组件,一个能够执行一个或多个I/O操作。
Channel接口:
  channel只有两个状态open close
  所以在这个接口中只有两个方法
      public boolean isOpen();
   public boolean isClose();
ReadableByteChannel 接口:
  实现了Channel接口
  还有     public int read(ByteBuffer dst) throws IOException; 返回从ByteBuffer中读取的字节数量。
WritableByteChannel接口:
  public int write(ByteBuffer src) throws IOException; 写入src中,返回写入的字节数量。
ScatteringByteChannel 接口
  继承了 ReadableByteChannel 并提供了同时往几个 ByteBuffer 中写数据的能力。
     public long read(ByteBuffer[] dsts, int offset, int length)  throws IOException;
      public long read(ByteBuffer[] dsts) throws IOException;
 GatheringByteChannel 接口
  继承了 WritableByteChannel 并提供了同时从几个 ByteBuffer 中读数据的能力。
    public long write(ByteBuffer[] srcs, int offset, int length)       throws IOException
  public long write(ByteBuffer[] srcs) throws IOException;
InterruptibleChannel 
  A channel that can be asynchronously closed and interrupted.
  用来表现一个可以被异步关闭的 Channel 。这表现在两方面:
1.    当一个 InterruptibleChannel 的 close() 方法被调用时,其它 block 在这个 InterruptibleChannel 的 IO 操作上的线程会接收到一个                  AsynchronousCloseException 。
2.    当一个线程 block 在 InterruptibleChannel 的 IO 操作上时,另一个线程调用该线程的 interrupt() 方法会导致 channel 被关闭,该线程收到一个 ClosedByInterruptException ,同时线程的 interrupt 状态会被设置。
  
  介绍完了其中的接口,接下来介绍一下其中的类:


  
  NIO--非阻塞 IO 允许应用程序同时监控多个 channel 以提高性能,这一功能是通过 Selector , SelectableChannel 和 SelectionKey 这 3 个类来实现的。

  他们之间的关系是这样的(个人理解,欢迎拍砖) ---只是画出了其中的一部分 ,从其他数据源来获取数据。

  
SelectionKey
   A selection key is created each time a channel is registered with a selector.  A key remains valid until it is canceled by call cancel method. 当使用selector 注册一个channel的时候就会创建一个SelectionKey。
  Cancelling a key does not immediately remove it from its selector,It is instead added to the selector`s cancelled-key set.

  在SelectionKey 中维护者两个keySet interest set  和 ready set

     The <i>interest set</i> determines which operation categories will   be tested for readiness the next time one of the selector's       selection  methods is invoked. The interest set is initialized with the value given   when the key is created; it may later be        changed via the  interestOps(int)  method.

    The <i>ready set</i> identifies the operation categories for which  the key's channel has been detected to be ready by the key's       selector.  The ready set is initialized to zero when the key is created; it may later  be updated by the selector during a         selection operation, but it cannot be updated directly.

    Selection keys are safe for use by multiple concurrent threads.  Selection keys是线程安全的,其中的读写操作都使用同步方法      加以控制。 

  构造方法;  他不能通过传统的构造函数的方式来获取构造实例。通常使用Selector中的方法来获取所有的可用的SelectionKey 集合,然后再在其中根据他们各自的状态选择自己真正需要的SelectionKey.

     public abstract Set<SelectionKey> selectedKeys(); 或者     public abstract Set<SelectionKey> keys();

  这其中有几个非常重要的判断方法

        public abstract boolean isValid(); // Tells whether or not this key is valid. 判断是否有效

      public final boolean isReadable();//Tests whether this key's channel is ready for reading. 是否可以读取

     public final boolean isWritable() //   Tests whether this key's channel is ready for writing.

  还有几个重要的常量,经常用来对SelectionKey的筛选,选择自己所需。

    OP_READ,OP_WRITE,OP_CONNECT,OP_ACCEPT。后面两个经常用来SocketChannel 和ServerSocketChannel

  另外还可以从中获取selector 和channel

Selector  -- 称之为选择器

  A selector may be created by invoking the  open method of this class.e.g. selector = Selector.open();

  如果想要从channel中获取数据,首先要做的就是将channel 注册到selector上面。

常用方法:

      public abstract boolean isOpen();  Tells whether or not this selector is open

    public abstract int select(long timeout);Selects a set of keys whose corresponding channels are ready for I/O operations;返回当前可用的selecionKeys数量,timeout 表示可以等待的时长。

   public abstract int select() throws IOException; 同上,无需等待直接返回。

SelectableChannel

这个抽象类是所有支持非阻塞 IO 操作的 channel (如 DatagramChannel 、 SocketChannel )的父类。 SelectableChannel 可以注册到一个或多个 Selector 上以进行非阻塞 IO 操作。

SelectableChannel 可以是 blocking 和 non-blocking 模式(所有 channel 创建的时候都是 blocking 模式),只有 non-blocking 的 SelectableChannel 才可以参与非阻塞 IO 操作。

  SelectableChannel configureBlocking(boolean block)    设置 blocking 模式。false,为非阻塞。

boolean isBlocking()      返回 blocking 模式。

通过 register() 方法, SelectableChannel 可以注册到 Selector 上。

  接下来会介绍SelectableChannel的一些子类,欢迎拍砖。

初识Channel的更多相关文章

  1. GO语言之channel

    前言: 初识go语言不到半年,我是一次偶然的机会认识了golang这门语言,看到他简洁的语法风格和强大的语言特性,瞬间有了学习他的兴趣.我是很看好go这样的语言的,一方面因为他有谷歌主推,另一方面他确 ...

  2. Redis——学习之路三(初识redis config配置)

    我们先看看config 默认情况下系统是怎么配置的.在命令行中输入 config get *(如图) 默认情况下有61配置信息,每一个命令占两行,第一行为配置名称信息,第二行为配置的具体信息.     ...

  3. 《Go并发编程实战》读书笔记-初识Go语言

    <Go并发编程实战>读书笔记-初识Go语言 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在讲解怎样用Go语言之前,我们先介绍Go语言的特性,基础概念和标准命令. 一. ...

  4. 联盟链初识以及Fabric环境搭建流程

    这篇文章首先简单介绍了联盟链是什么,再详细的介绍了Fabric环境搭建的整个流程. 区块链分类: 以参与方式分类,区块链可以分为:公有链.联盟链和私有链. 定义: 我们知道区块链就是一个分布式的,去中 ...

  5. 初识zookeeper(1)之zookeeper的安装及配置

    初识zookeeper(一)之zookeeper的安装及配置 1.简要介绍 zookeeper是一个分布式的应用程序协调服务,是Hadoop和Hbase的重要组件,是一个树型的目录服务,支持变更推送. ...

  6. Android-Window(一)——初识Window

    Android-Window(一)--初识Window 学习自 <Android开发艺术探索> https://blog.csdn.net/qian520ao/article/detail ...

  7. Go从入门到精通(一)go语言初识

    一.第一个go程序 package main import ( "fmt" ) func main(){ fmt.Println("hello world") ...

  8. Java NIO学习与记录(一):初识NIO

    初识 工作中有些地方用到了netty,netty是一个NIO框架,对于NIO却不是那么熟悉,这个系列的文章是我在学习NIO时的一个记录,也期待自己可以更好的掌握NIO. 一.NIO是什么? 非阻塞式I ...

  9. 初识Golang编程语言

    初识Golang编程语言 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Go 是年轻而有活力的语言,有网友说:"Go语言将超过C,Java,成为未来十年最流行的语言&qu ...

随机推荐

  1. 6.PHP 教程_PHP数据类型

    PHP数据类型 String(字符串),Integer(整型),Float(浮点型),Boolean(布尔型),Array(数组),Object(对象), NULL(空值). PHP字符串 一个字符串 ...

  2. Android UiAutomator 自动化测试环境搭建---新手1

    1.首先需要准备的工具有 1.java jdk 2. android开发工具 adt 3.ant 安装包(如果下载adt里面有) 2.首先安装java环境,jdk这个百度就可以了. 3.android ...

  3. 帝国cms7.0忘记后台管理账户用户名密码

    最近刚登陆以前的网站,但是发现自己的后台管理用户名密码已经忘记,于是到帝国cms论坛里面找了一下解决方案,成功解决问题.特此分享一下解决成功经验. 原帖地址:http://bbs.phome.net/ ...

  4. 帝国cms修改[!--show.listpage--]分页页码所生成的html标签

    在使用帝国cms系统时,我们用[!--show.page--]和[!--show.listpage--]来生成页码 其中[!--show.listpage--]所生成的html页码代码为: <a ...

  5. 宣布正式发布 Windows Azure 多重身份验证

    身份和访问管理是安全之锚,是企业 IT 部门的首要任务.它是随时随地向员工.合作伙伴和客户提供访问的关键所在.今天,我们非常高兴地宣布正式发布 Windows Azure 多重身份验证,从而为 IT ...

  6. mac 如何显示隐藏文件和.点开头文件?

    如果想在Finder中就能直观看到隐藏文件,那么在终端中输入以下下命令: defaults write com.apple.Finder AppleShowAllFiles YES killall F ...

  7. zend framework多模块配置

    上次接触zend framework已经很久远了,10年的事情了.最近在做一个项目,时间不紧,就又把ZF拿出来折腾.而我发现以前做ZF的记忆已经在我脑中如梦幻泡影,消失无踪,为了配置多模块还又去查了资 ...

  8. 《Java虚拟机原理图解》 1.2.2、Class文件里的常量池具体解释(上)

    [last updated:2014/11/27] NO1.常量池在class文件的什么位置? 我的上一篇文章<Java虚拟机原理图解> 1.class文件基本组织结构中已经提到了clas ...

  9. Tableau 群集部署

    由于公司连续两个月月底Tableau服务器过载崩溃,因此有了搭建Tableau服务器群集的想法.目前还在测试阶段,所以做一步写一步了. 目录: 一.安装和配置工作服务器 二.其他参考文档 一. 安装和 ...

  10. Mybatis 逆向工程

    Mybatis逆向工程: 推荐用Java和XML Configuration的方式生成逆向文件 Java类: package generation; import java.io.File; impo ...