1,阻塞式I0 和 非阻塞式IO 是什么意思有什么区别阻塞模式是指某个输入流在执行到某步骤时,需要外界或者其他外部数据的输入后该流才能继续往下执行 , 在未得到外部数据之前,该流是静止不动的,这就是阻塞模式 。ps:按照我自己的理解 比如,一个小程序要求实现用户输入一个字符串后再将该字符串
2,什么叫非阻塞IO比如进程A要从网络收一个包,如果没有包就等待,这就是阻塞 。不等待,去做别的事情,等包来了再处理就是不阻塞 。就是io不阻塞即使没有数据可读,或者空间可写时 。异步io都返回,不管如何情况 。简单点的意思就是进程不会阻塞在你读写调用异步io系统调用的时候 。所以你的执行流可以去做其它的事情,当你确实要确认数据读写成功的时候
3,为什么说Java NIO 是非阻塞的NIO之前的IO流要实现非阻塞得用户程序创建线程实现,每个线程内部用阻塞判断IO中断.而线程太占资源.不适用于IO高并发.为解决线程太占资源问题还提供了线程池框架.但也没完全解决IO高并发问题.NIO框架则采取用户程序将IO需求注册入NIO框架,NIO框架用单线程循环查询全部IO需求,并分派响应IO需求.这样的好处是减少了高并发时的线程切换.用户程序编程上看没有阻塞的方法调用.【所有的io流都是非阻塞的吗,阻塞式I0 和 非阻塞式IO 是什么意思有什么区别】
4,非阻塞IO为什么能降低线程数量首先非阻塞 原理还是在其他线程中去执行功能,而不是在调用此功能的线程中去执行 , 调用线程在调用后可以立即返回调用处继续往下执行,所以不会阻塞,但是原本一个线程做的事情,现在让几个线程去做了,线程数量肯定增加了 , 但是此进程,这里是进程,可使用的线程数 是减少的,是可使用 。1、写程序的关键是要有控制流,当程序块中的处理涉及到死循环的时候更要加量的控制 。2、像这种情况 , 两个步骤 , 一 , 为io时的创建线程,加一个数量的阈值,超过它后则不再创建 。二,为每个线程设置标志变量标志该线程是否已经束,或是直接加入线程组去管理 。3、回看你的程序需求,明显设计不合理 。其实应当创建一个线程池去搞定这个业务需求 。再想想吧 。5,java io流的典型使用方式有几种Java中IO流分成两大类,一种是输入流,所有的输入流都直接或间接继承自InputStream抽象类,输入流作为数据的来源,我们可以通过输入流的read方法读取字节数据;另一种是输出流 , 所有的输出流都直接或间接继承自OutputStream抽象类,输出流接收数据 , 可以通过write方法写入字节数据 。Java的IO流类中,大部分的输入流和输出流都是成对存在的 , 即如果存在XXXInputStream,那么就存在XXXOutputStream,反之亦然 。SequenceInputStream和StringBufferInputStream是特例,没有对应的SequenceOutputStream类和StringBufferOutputStream类,许多IO操作都可能会抛出IOException异常,比如read、write、close操作 。以下是Java的IO流中常见的输入流,由于每个输入流都有其对应的输出流,所以此处就不再列出输出流的继承结构图 。1、ByteArrayInputStream & ByteArrayOutputStream: ByteArrayInputStream构造函数中需要传入一个byte数组作为数据源,当执行read操作时,就会从该数组中读取数据 , 正如其名,是一种基于字节数组实现的一种简单输入流,显而易见的是 , 如果在构造函数中传入了null作为字节数据,那么在执行read操作时就会出现NullPointerException异常,但是在构造函数初始化阶段不会抛出异常;与之相对应的是ByteArrayOutputStream,其内部也有一个字节数组用于存储write操作时写入的数据,在构造函数中可以传入一个size指定其内部的byte数组的大?。绻恢付?nbsp;, 那么默认它会将byte数组初始化为32字节,当持续通过write向ByteArrayOutputStream中写入数据时,如果其内部的byte数组的剩余空间不能够存储需要写入的数据 , 那么那么它会通过调用内部的ensureCapacity方法对其内部维护的byte数组进行扩容以存储所有要写入的数据 , 所以不必担心其内部的byte数组太小导致的IndexOutOfBoundsException之类的异常 。2、FileInputStream & FileOutputStream FileInputStream 能够将文件作为数据源,读取文件中的流,通过File对象或文件路径等初始化,在其构造函数中,如果传入的File对象(或与其相对应的文件路径所表示的File对象)不存在或是一个目录而不是文件或者由于其他原因无法打开读取数据,都会导致在初始化阶段导致抛出FileNotFoundException异常;与FileInputStream 相对应的是FileOutputStream,可以通过FileOutputStream向文件中写入数据,也需要通过File对象或文件路径对其初始化,如同FileInputStream,如果传入的File对象(或与其相对应的文件路径所表示的File对象)是一个目录而不是文件或者由于其他原因无法创建该文件写入数据,都会导致在初始化阶段抛出FileNotFoundException异常 。3、PipedInputStream & PipedOutputStream PipedInputStream和PipedOutputStream一般是结合使用的,这两个类用于在两个线程间进行管道通信,一般在一个线程中执行PipedOutputStream 的write操作,而在另一个线程中执行PipedInputStream的read操作 。可以在构造函数中传入相关的流将PipedInputStream 和PipedOutputStream 绑定起来 , 也可以通过二者的connect方法将二者绑定起来,一旦二者进进行了绑定 , 那么PipedInputStream的read方法就会自动读取PipedOutputStream写入的数据 。PipedInputStream的read操作是阻塞式的 , 当执行PipedOutputStream的write操作时,PipedInputStream会在另一个线程中自动读取PipedOutputStream写入的内容 , 如果PipedOutputStream一直没有执行write操作写入数据,那么PipedInputStream的read方法会一直阻塞PipedInputStream的read方法所运行的线程直至读到数据 。单独使用PipedInputStream或单独使用PipedOutputStream时没有任何意义的,必须将二者通过connect方法(或在构造函数中传入对应的流)进行连接绑定,如果单独使用其中的某一个类,就会触发IOException: Pipe Not Connected.4、ObjectInputStream & ObjectOutputStream ObjectOutputStream具有一系列writeXXX方法,在其构造函数中可以掺入一个OutputStream,可以方便的向指定的输出流中写入基本类型数据以及String,比如writeBoolean、writeChar、writeInt、writeLong、writeFloat、writeDouble、writeCharts、writeUTF等,除此之外,ObjectOutputStream还具有writeObject方法 。writeObject方法中传入的类型必须实现了Serializable接口,从而在执行writeObject操作时将对象进行序列化成流 , 并将其写入指定的输出流中 。与ObjectOutputStream相对应的是ObjectInputStream,ObjectInputStream有与OutputStream中的writeXXX系列方法完全对应的readXXX系列方法,专门用于读取OutputStream通过writeXXX写入的数据 。5、SequenceInputStream SequenceInputStream 主要是将两个(或多个)InputStream在逻辑上合并为一个InputStream,比如在构造函数中传入两个InputStream,分别为in1和in2,那么SequenceInputStream在读取操作时会先读取in1,如果in1读取完毕,就会接着读取in2 。在我们理解了SequenceInputStream 的作用是将两个输入流合并为一个输入流之后 , 我们就能理解为什么不存在对应的SequenceOutputStream 类了,因为将一个输出流拆分为多个输出流是没有意义的 。6、StringBufferInputStream StringBufferInputStream允许通过在构造函数中传入字符串以读取字节 , 在读取时内部主要调用了String的charAt方法 。与SequenceInputStream类似 , StringBufferInputStream也没有对应的OutputStream,即不存在StringBufferOutputStream类 。Java没有设计StringBufferOutputStream类的理由也很简单,我们假设StringBufferOutputStream存在 , 那么StringBufferOutputStream应该是内部通过执行write操作写入数据更新其内部的String对象,比如有可能是通过StringBuilder来实现,但是这样做毫无意义 , 因为一旦我们String的构造函数中可以直接传入字节数组构建字符串 , 简单明了 , 所以设计StringBufferOutputStream就没有太大的必要了 。StringBufferInputStream这个类本身存在一点问题,它不能很好地将字符数组转换为字节数组,所以该类被Java标记为废弃的(Deprecated),其官方推荐使用StringReader作为代替 。7、FilterInputStream & FilterOutputStream FilterInputStream包含了其他的输入流 , 说具体点就是在其构造函数中需要传入一个InputStream并将其保存在其名为in的字段中,FilterInputStream只是简单的覆盖了所有的方法 , 之所说是简单覆盖是因为在每个覆盖函数中,它只是调用内部的保存在in字段中的InputStream所对应的方法 , 比如在其覆盖read方法时,内部只是简单调用了in.read()方法 。FilterInputStream的子类可以进一步覆盖某些方法以保持接口不变的情况下实现某一特性(比如其子类有的可以通过使用缓存优化读取的效率)或者提供一些其他额外的实用方法 。所以在使用时FilterInputStream可以让传入的InputStream具有一些额外的特性,即对构造函数传入的InputStream进行了一层包裹,使用了典型的装饰着模式,如果只看FilterInputStream本身这一个类的话,则该类自己本身意义不大,因为其只是通过内部的字段in简单覆写某些方法 。但是如果将FilterInputStream 和其子类结合起来使用话 , 那么就很有用了 。比如FilterInputStream 有两个子类BufferedInputStream和DataInputStream,这两个类在下面还会详细介绍 。BufferedInputStream对read操作做了优化,每次读操作时都读取一大块数据,然后将其放入内部维护的一个字节数组缓冲区中 。当外面调用BufferedInputStream的read方法时,首先去该缓冲区中读取数据 , 这样就避免了频繁的实际的读操作,BufferedInputStream对外没有暴露额外的其他方法,但是其内部的read方法已经经过优化了 , 所以在执行读操作的时候效率更高 。DataInputStream与ObjectInputStream有点类似,可以通过一些readXXX方法读取基本类型的数据,这是非常有用的一些方法 。8、BufferedInputStream & BufferedOutputStream 如上面所介绍的那样,在BufferedInputStream的构造函数中需要传入一个InputStream,BufferedInputStream内部有一个字节数组缓冲区,每次执行read操作的时候就从这buf中读取数据,从buf中读取数据没有多大的开销 。如果buf中已经没有了要读取的数据,那么就去执行其内部绑定的InputStream的read方法 , 而且是一次性读取很大一块数据,以便填充满buf缓冲区 。缓冲区buf的默认大小是8192字节,也就是8K,在构造函数中我们也可以自己传入一个size指定缓冲区的大小 。由于我们在执行BufferedInputStream的read操作的时候,很多时候都是从缓冲区中读取的数据 , 这样就大大减少了实际执行其指定的InputStream的read操作的次数 , 也就提高了读取的效率 。与BufferedInputStream 相对的是BufferedOutputStream 。在BufferedOutputStream的构造函数中我们需要传入一个OutputStream , 这样就将BufferedOutputStream与该OutputStream绑定在了一起 。BufferedOutputStream内部有一个字节缓冲区buf , 在执行write操作时,将要写入的数据先一起缓存在一起,将其存入字节缓冲区buf中,buf是有限定大小的,默认的大小是8192字节 , 即8KB,当然也可以在构造函数中传入size指定buf的大小 。该buf只要被指定了大小之后就不会自动扩容,所以其是有限定大小的,既然有限定大?。?就会有被填充完的时刻,当buf被填充完毕的时候会调用BufferedOutputStream的flushBuffer方法 , 该方法会通过调用其绑定的OutputStream的write方法将buf中的数据进行实际的写入操作并将buf的指向归零(可以看做是将buf中的数据清空) 。如果想让缓存区buf中的数据理解真的被写入OutputStream中,可以调用flush方法,flush方法内部会调用flushBuffer方法 。由于buf的存在,会大大减少实际执行OutputStream的write操作的次数,优化了写的效率 。4种 。。。。http://www.2cto.com/kf/201312/262036.html
- 模块功能需求分析,流程图在需求分析还是在模块设计
- 优惠券功能的业务流程设计图谱 优惠券redis处理
- 成功的物流中心案例分析,德国不莱梅物流中心案例分析
- mongodb显示所有数据库 mongodb数据突然为空
- bf图片,cr400bf图片
- 电脑清理分析磁盘,电脑个人文件所在磁盘已满怎么清理
- redis集群存储数据策略 redis集群数据流转
- mongodb修改数据 mongodb修改所有信息
- mysqlef5
- mysqli获取所有数据 mysql的提取函数
