zoukankan      html  css  js  c++  java
  • 简单理解io与nio

    io是面向流的,而nio是面向缓冲区的;

    io每次从流中读取一个或者多个字节,直到读取完所有的字节,这就意外着它是阻塞式的,当一个线程执行read或者write的时候,这个线程是不能够再去做其他的事情了;

    nio会读取数据放到一个缓冲区里,这样可以增加读取数据的灵活性,可以前后移动读取数据的位置,它是非阻塞的,它大概由以下组成部分:

    channel即通道、buffer即缓冲区、selector即选择器

    channel可以是单向通道也可以是双向通道,双向通道实现了读和写的接口,单向通道只实现了其中的一个;需要注意的是,通过FileInputStream获取的channel虽然实现了读写两个接口,

    但是由于FileInputStream是以读文件的权限打开文件的,所以这个时候执行write方法的时候是会抛出异常的;

    可以以一个简单的生活例子来形容nio:

    三两个好友一起去餐厅吃饭,坐下来的时候,招手叫服务员过来点菜,点完菜之后服务员在前台会有一张单记录是哪个餐桌点了哪些菜,然后就开始让师傅去做菜,三两个好友在等菜上来的这段时间,

    可以吹吹水,闲聊人生,亦或者可以摇色子,喝喝酒,等到菜烹饪好了的时候,师傅端着菜过来问服务员是哪个桌子的菜,服务员查看了记录单之后确定了是那张桌子的菜,告诉师傅端过去了,等菜上了的时候,

    三两个好友停下了摇色子之类的事,开始吃饭了。

    这是生活中一个很简单又贴切的例子,解释一下:记录单就相当于是selector,服务员就相当于selector的轮询线程,三两个好友点菜就相当于向selector注册事件,

    总结起来就是:

    假设现在有个客户端和服务端建立了双向的channel,以服务端为例,它会向selector注册读和写事件,selector会有一个单独的线程去轮询,看看是否有可用的时间到达,如果有则执行事件,比如现在客户端向

    服务端发送了数据,selector的线程会找到读事件,然后就开始从buffer里面读取数据

  • 相关阅读:
    乒乓操作
    Poj 2010-Moo University
    POJ
    spirngmvc POJO参数映射详解
    spring AOP解析之xml方式详解
    spring AOP解析之xml方式详解
    springmvc POJO参数映射详解
    springmvc RequestMappingHandlerAdapter初始化详解
    springmvc RequestMappingHandlerMapping初始化详解
    Jquery的选择器
  • 原文地址:https://www.cnblogs.com/xulibing/p/9516793.html
Copyright © 2011-2022 走看看