zoukankan      html  css  js  c++  java
  • IO & NIO

    1,Java NIO  

    Java non-blocking IO 即 非阻塞IO,线程在等待的时候,可以做其他的事情。

    2,IO 对比NIO

    IO 是面向流,NIO 是面向缓冲

    面向流是指每次从流中读出一个或者多个字节,直到全部读出为止

    面向缓冲区是指将数据先存到一个缓存区

    IO 是阻塞, NIO 是非阻塞

    IO: 当线程调用read() 或者write() 的时候,只有当数据被读取或者完全写入,否则该线程在此期间干不了其他事情。

    NIO: 一个线程向通道发送请求读取数据开始,直到数据变的可以读取之前,线程不会阻塞,可以一直做其他事情。

    3,IO 与 NIO 的选择

    每次发送少量数据,但是需要建立多个通道的情况,例如聊天室,这种情况适合用NIO

    大量数据,少量连接,这种情况适合用IO

    4,NIO有三个核心模块:Selector(选择器)、Channel(通道)、Buffer(缓冲区);

    Buffer:与Channel 进行交互时,需要将数据从Channel 读取到Buffer,从Buffer 写入到Channel,缓冲区本质上是一块可以存取数据的内存,只是被包装成了NIO  Buffer 对象,提供一些方法,可以访问。

    缓冲区基本类型:ByteBuffer;CharBuffer;ShortBuffer;IntBuffer;LongBuffer;FloatBuffer;DoubleBuffer;

    Channel: Channel好比IO 流的模拟,任何数据read() 或者write(),都必须通过Channel对象。

    Selector:NIO 用select 机制,不用为每一个客户端连接新的线程处理,而是将其注册到Selector 对象中,这样单线程利用Selector 对象管理大量的并发的网络连接。

    当有读写或时间发生时候,可以从Selector对象中获得一个SelectorKey 通过这个SelectorKey 可以找到具体的Channel 来获取从客户端传过来的数据。

    通道和缓冲区的机制,使得线程无需阻塞地等待IO事件的就绪,但是总是要有人来监管这些IO事件。这个工作就交给了selector来完成,这就是所谓的同步。

    要使用Selector,得向Selector注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪,这就是所说的轮询。一旦这个方法返回,线程就可以处理这些事件。

        Selector中注册的感兴趣事件有:

    • OP_ACCEPT:即连接事件(TCP 连接), 对应于SelectionKey.OP_CONNECT;

    • OP_CONNECT :即确认事件, 对应于SelectionKey.OP_ACCEPT;

    • OP_READ :即读事件, 对应于SelectionKey.OP_READ, 表示 buffer 可读.

    • OP_WRITE:即写事件, 对应于SelectionKey.OP_WRITE, 表示 buffer 可写.

  • 相关阅读:
    Sqlserver 获得范围内的随机数过程
    Alpha项目测试
    第三次作业
    第二次作业
    Surprise团队项目总结
    Surprise团队第四周项目总结
    Surprise团队第三周项目总结
    Surprise团队第二周项目总结
    Surprise团队第一周项目总结
    5种常用的相关分析方法
  • 原文地址:https://www.cnblogs.com/pickKnow/p/9712062.html
Copyright © 2011-2022 走看看