zoukankan      html  css  js  c++  java
  • Java IO、BIO、NIO、BIO

    一、什么是IO/NIO:

      IO:即BIO(Blocking IO);面向流的、同步阻塞式IO;(JDK1.4之前唯一的选择)

      NIO:面向缓冲的、同步非阻塞式IO;三大核心部分:Selector、Channel(通道)、Buffer(缓冲区);(JDK1.4引进的,一般网络编程中用得较多)

      AIO:异步非阻塞式IO;(JDK1.7引进,算较新的特性)

    二、同步、异步、阻塞、非阻塞(分布式系统角度理解,较抽象):

      同步异步 和 阻塞非阻塞并没有直接的关系。

      

      同异步描述的是一种"消息机制";比如两个线程A,B,线程A请求线程B需要一些数据,然后B去给A拿数据去:(主被动关系)

        1:同步机制下,线程A要定时去主动的问A数据拿来没有。

        2:异步机制下,线程A请求完B,就不管了,B如果把数据拿来准备好了,由B来通知A来处理。

      

      阻塞非阻塞:描述的是线程间请求时所处的一种状态:(能不能去做别的事)

        1:阻塞:体现在A请求B,一直到到读取数据B的过程中,A线程被挂起(期间不能使用CPU),直到当前数据段获取完了。(一次while()的执行)。

        2:非阻塞:体现在A请求到获取数据之间,A线程不会被挂起,从请求准备好数据这个阶段,A可以离开去做其它事。

      注:同步异步,一般我们从编程中的多线程的角度理解是:同步强调线程间的时序关系,A要在B完成后才能继续。异步则是指AB两个分工完成部分任务,两者无需关心前后完成的关系。

           

    三、组合:

      同步阻塞:Java传统的IO就是 同步阻塞,A请求B拿数据,然后A之后需要主动去询问B是否准备好了,到B准备好了数据并且A获取到了数据期间,A不能干别的事,直到A获取完数据。

      同步非阻塞:Java中的NIO就是 同步非阻塞,A需要主动去询问B是否准备好了,与同步阻塞的区别在于,A询问B之间A可以不阻塞,A可以去做别的事。

      异步阻塞:A请求B拿数据,然后A不需要主动去询问B是否准备好了,到B准备好了数据会通知A来获取,因为也是阻塞,A也不能干别的事,直到A获取完数据。(理论是这样,但现实中这样的应用应该不多。。)

      异步非阻塞:Java中的AIO就是 异步非阻塞,A请求B拿数据,然后A不需要主动去询问B是否准备好了,到B准备好了数据会通知A来获取,因为是非阻塞,A第一次请求B去拿数据后,A可以去做别的了。

    四:Java nio的好处(同步非阻塞):

      整体结构使用了反应器的设计模式(Reactor):

      参考:Reactor模式详解

      

      在实际使用中,Java NIO的优点主要体现在高并发时,其中Selector充当请求和询问者的角色,Selector会和多个Channel绑定,询问哪个Channel准备好了,如果有监听到需要的事件,就执行对应的操作。

    之前提到的 非阻塞时做别的事,在这里可以理解为Selector去询问完当前的Channel,它这时可以去询问其它的Channel,而不用守在一个Channel前直到处理完这个Channel的数据。

    五、编程中的while()方法与阻塞:

      阻塞与否不是体现在这里的while()方法,在while()执行时其它已经说明请求已经准备好了;

      阻塞是体现在第一次讲求读取数据并执行IO中的read()write()方法的过程,这个过程中线程A不能做别的事。

      执行while()的日的是为了读取完想要的数据,while()执行了多少次,阻塞就发生了多少次。

    可参考:

      样理解阻塞非阻塞与同步异步的区别?(知乎第一个严肃答案)

      同步阻塞、同步非阻塞、异步阻塞、异步非阻塞(知乎第二个郭无心答案)

      结合原理图理解

      并发网NIO系列详解

  • 相关阅读:
    werfault进程使用CPU率高
    oracel 拆分字符串
    TCP TIME WAIT
    netstat 命令
    Java 理论与实践: 并发集合类
    DIV与SPAN之间有什么区别
    oracle超出打开游标的最大数的原因和解决方案
    Quartz表达式
    Axis创建webservice客户端和服务端
    Web服务cxf框架发布2
  • 原文地址:https://www.cnblogs.com/mzzcy/p/7017571.html
Copyright © 2011-2022 走看看