阻塞IO
最传统的一种IO模型,即在读写数据过程中会发生阻塞现象。当用户线程发出IO 请求之后,内 核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用 户线程交出CPU。当数据就绪之后,内核会将数据拷贝到用户线程,并返回结果给用户线程,用户线程才解除block状态。典型的阻塞IO模型的例子为:data = socket.read();如果数据没有就 绪,就会一直阻塞在read方法。
非阻塞IO
当用户线程发起一个read操作后,并不需要等待,而是马上就得到了一个结果。如果结果是一个 error时,它就知道数据还没有准备好,于是它可以再次发送read操作。一旦内核中的数据准备 好了,并且又再次收到了用户线程的请求,那么它马上就将数据拷贝到了用户线程,然后返回。 所以事实上,在非阻塞IO模型中,用户线程需要不断地询问内核数据是否就绪,也就说非阻塞IO 不会交出CPU,而会一直占用CPU。典型的非阻塞IO模型一般如下:

while(true){
data = socket.read();
if(data!= error){
处理数据 break;
}
} 但是对于非阻塞IO就有一个非常严重的问题,在while循环中需要不断地去询问内核数据是否就 绪,这样会导致CPU占用率非常高,因此一般情况下很少使用while循环这种方式来读取数据。
多路复用IO
多路复用IO模型是目前使用得比较多的模型。Java NIO实际上就是多路复用IO。在多路复用IO 模型中,会有一个线程不断去轮询多个socket的状态,只有当socket真正有读写事件时,才真 正调用实际的IO读写操作。因为在多路复用IO模型中,只需要使用一个线程就可以管理多个 socket,系统不需要建立新的进程或者线程,也不必维护这些线程和进程,并且只有在真正有 socket读写事件进行时,才会使用IO资源,所以它大大减少了资源占用。在Java NIO中,是通 过selector.select()去查询每个通道是否有到达事件,如果没有事件,则一直阻塞在那里,因此这 种方式会导致用户线程的阻塞。多路复用IO 模式,通过一个线程就可以管理多个socket,只有当 socket真正有读写事件发生才会占用资源来进行实际的读写操作。因此,多路复用IO 比较适合连 接数比较多的情况。
另外多路复用IO为何比非阻塞IO模型的效率高是因为在非阻塞IO 中,不断地询问socket状态 时通过用户线程去进行的,而在多路复用IO 中,轮询每个socket状态是内核在进行的,这个效 率要比用户线程要高的多。
不过要注意的是,多路复用IO 模型是通过轮询的方式来检测是否有事件到达,并且对到达的事件 逐一进行响应。因此对于多路复用IO模型来说,一旦事件响应体很大,那么就会导致后续的事件 迟迟得不到处理,并且会影响新的事件轮询

Java IO/NIO相关推荐

  1. java io nio socket_通过socket编程掌握IO流 —— NIO

    一.本次目标 改造server,采用NIO读取client信息: 改造client,亦采用NIO发送消息,与之前不同的BIO形成对比: 二.编码 1.新建byte数组拼接公共类 主要用作在channe ...

  2. java io nio aio_Java IO、NIO、AIO知识总结

    本文主要讲述下自己对IO的理解,对IO的用法和细则可能没有顾虑到. 本文的理解基于以下几篇文章,他们对各自部分都讲的很细,对我理解IO提供了很大帮助. 该文主要讲解了Java IO的类体系以及他们各自 ...

  3. Java IO/NIO教程

    Java IO教程 http://tutorials.jenkov.com/java-io/index.html Java NIO教程 英文版: http://tutorials.jenkov.com ...

  4. Java IO NIO NIO2

    概览 IO是Java中的最重要的一个部分. 其中, java.io是所有编程者都应该掌握的IO方式. 在Java 1.4中, NIO被引入, 它引进了一种新的相对于流模型的新的IO模型, 以为非阻塞I ...

  5. 以点破面——JAVA IO/NIO

    JAVA IO 阻塞IO模型 最传统的一种 IO 模型,即在读写数据过程中会发生阻塞现象.当用户线程发出 IO 请求之后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞 ...

  6. java ----IO/NIO/AIO

    1 使用File API里有很多关于File的使用方法: 案例:向磁盘创建文件 创建多级文件夹: 需要加s 把D盘的文件移动到C盘并且改为a.zip 2 文件遍历案例 找某盘下,大小为xxmb,后缀为 ...

  7. java io nio pio_Netty之BIO(同步阻塞IO)、PIO(偽異步阻塞IO)、NIO(異步非阻塞IO)、AIO(異步非阻塞IO)、Netty...

    學習書籍:Netty權威指南 多種IO方式的比較: 1.BIO(同步阻塞IO) 使用ServerSocket綁定IP地址和監聽端口,客戶端發起連接,通過三次握手建立連接,用socket來進行通信,通過 ...

  8. Java ---- java io / java nio / java net 学习资源汇总

    Java IO教程 Java NIO 系列教程 Java网络教程 学习Java基础的一个英文网站:http://tutorials.jenkov.com/ ,上面中文教程来自并发编程网,上面中文教程翻 ...

  9. 五.Java IO、NIO、文件、通讯

    2019独角兽企业重金招聘Python工程师标准>>> Java 的 I/O 大概可以分成四组: 基于字节操作的 I/O :InputStream 和 OutputStream 基于 ...

最新文章

  1. 刚入Linux坑常见的8大问题
  2. 基于墨刀实现的短视频分享软件原型设计
  3. RT-Thread对GPIO操作两种方式的区别:1)通过设备操作接口2)直接通过通用GPIO设备驱动
  4. 前端每周清单第 34 期:Vue 现状盘点与 3.0 展望,React 代码迁移与优化,图片优化详论...
  5. python词云下载什么_python词云安装什么库
  6. 19天津大学计算机考研群,19天津大学金融专硕431经验贴
  7. ubuntu文件系统知识
  8. Linux运维工程师面试知识点汇总(二)
  9. CSS(定位、淘宝轮播图案例、网页布局总结、元素的显示和隐藏、鼠标经过显示遮罩)
  10. 《不能承受的生命之轻》
  11. 技术管理实战笔记-团队建设篇
  12. 全年爆文率14%+,这个小红书品牌的内容营销密码是什么?
  13. 软件架构设计杂记: 好作品是改出来的,好的代码是不断重构打磨出来的, 心性是历经艰难困苦修炼出来的
  14. Win10下开机自动启动运行bat脚本并打开cmd运行命令
  15. 【TDA2x学习】3、软件架构分析
  16. flash制作水波,根据鼠标点击产生效果
  17. ROS wiki安装及配置
  18. circular import问题
  19. html怎么转换bmp,BMP是什么格式 怎么把BMP转成JPG格式的方法
  20. php快递单号查询接口实例

热门文章

  1. 开源无人机手机地面站之Towe(一)
  2. Android静默拍照实现
  3. 2022年4月14日【Jiawei_Z】瑞萨的开发环境的使用01
  4. churn rate 流失率
  5. Tableau图表 • 棒棒糖图
  6. java设计模式 通俗解释
  7. Nacos 单机集群搭建及常用生产环境配置 | Spring Cloud 3
  8. 华为端口隔离实现原理及配置命令
  9. sklearn中svr(支持向量机回归)
  10. 20年架构师带你彻底搞懂查询分离的实现思路