首页 > 编程语言 >JAVA中三种I/O框架——BIO、NIO、AIO

JAVA中三种I/O框架——BIO、NIO、AIO

时间:2023-09-22 14:44:23浏览次数:50  
标签:BIO JAVA NIO 模型 线程 IO

一、BIO(Blocking I/O)

BIO,同步阻塞IO模型,应用程序发起系统调用后会一直等待数据的请求,直至内核从磁盘获取到数据并拷贝到用户空间;
在一般的场景中,多线程模型下的BIO是成本较低、收益较高的方式。但是,如果在高并发的场景下,过多的创建线程,会严重占据系统资源,降低系统对外界响应效率。即使使用线程池,只能一定程度上缓解了频繁调用IO接口带来的资源占用。

二、NIO(Non-Blocking/New I/O)

NIO,JAVA中与JDK1.4引入该IO模型,但不要简单的理解为同步非阻塞,JAVA中的NIO实际上可以看作IO多路复用模型,下面简单介绍下这两种I/O模型。

2.1 同步非阻塞模型

应用程序向内核发起请求后,即使kernel没有从磁盘中取到数据,也会返回一个结果给用户,用户判断结果正确性,如果不是需要的数据,则后续继续发起请求,即轮询请求,直至kernel取到数据并返回。
采用轮询方式,会导致系统上下文切换开销很大,会大幅度推高CPU占用率。

2.2 IO多路复用模型

Java 中的 NIO ,有一个非常重要的选择器 ( Selector ) 的概念,也可以被称为 多路复用器。通过它,只需要一个线程便可以管理多个客户端连接。当客户端数据到了之后,才会为其服务。线程首先发起 select 调用,询问内核数据是否准备就绪,等内核把数据准备好了,用户线程再发起 read 调用。
IO 多路复用模型,通过减少无效的系统调用,减少了对 CPU 资源的消耗,解决了同步阻塞I/O和同步非阻塞I/O的问题,是一种非常高效的I/O模型。

三、AIO(Asynchronous I/O)

AIO,异步IO模型,也叫NIO2,JAVA7中引入,异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。

四、几种常见IO模型的对比

图片来自【美团技术团队】https://tech.meituan.com/2016/11/04/nio.html ,其中也详细阐述了NIO模型,可前往学习。

标签:BIO,JAVA,NIO,模型,线程,IO
From: https://www.cnblogs.com/lhcc924/p/17722329.html

相关文章

  • Java 21的StringBuilder和StringBuffer新增了一个repeat方法
    发现Java21的StringBuilder和StringBuffer中多了repeat方法:/***@throwsIllegalArgumentException{@inheritDoc}**@since21*/@OverridepublicStringBuilderrepeat(intcodePoint,intcount){super.repeat(codePoint,co......
  • 基于Java+vue开发的企事业移动培训考试平台
    随着移动互联网的快速发展,越来越多的企业开始关注移动培训和考试平台的开发。为了满足这一需求,我们可以使用Java和Vue来开发一个基于移动端的企事业培训考试平台。获取方式Q+:262086839一、背景和需求企事业移动培训考试平台是一个基于Web的应用程序,旨在提供一个方便、高效的......
  • 无涯教程-JavaScript - GAMMA.DIST函数
    描述GAMMA.DIST函数返回伽马分布。您可以使用此功能来研究可能具有偏斜分布的变量。伽马分布通常用于排队分析。语法GAMMA.DIST(x,alpha,beta,cumulative)争论Argument描述Required/OptionalXThevalueatwhichyouwanttoevaluatethedistribution.RequiredAlp......
  • 小白之IDEA创建java第一个程序
    (1)打开IDEA,创建项目名为first的项目。在src目录下创建名为HelloWorld的java类并写入代码再运行。  ......
  • java---字符串
    11.1概念字符串数据结构中的串,底层是由字符数组来进行封装而成的东西。字符串有一个特别的标志性的符号双引号"",字符串关键词是String,是一种特殊的引用数据类型。为什么特殊:1、因为引用数据类型的创建99%都是类名对象名=new类名();字符串的创建String变量名="值"字符......
  • Java POI导入超时问题如何解决
    前端导入Excel向后台发出请求时,后台立即返回信息“后台正在导入,请稍等!”,向redis中存入键isFinished的值为字符串“0”,并且开启一个线程来完成插入大量数据到数据库的工作,当插入完成则将redis中isFinished的值改为字符串“1”。前端收到“后台正在输入,请稍等!”后,此时导入按钮处于禁......
  • 基于Java web的动力租车管理系统的设计与实现-计算机毕业设计源码+LW文档
    DESIGNANDIMPLEMENTATIONOFPOWERCARRENTALMANAGEMENTSYSTEMBASEDONJAVAWEB ABSTRACTWiththerapiddevelopmentofInternettechnology,thecurrentlifestyleofpeoplehasundergonetremendouschanges.Especiallyundertheinfluenceofthesharing......
  • 已解决java.lang.ClassCastException: class java.lang.Integer cannot be cast to cl
    已解决java.lang.ClassCastException:classjava.lang.Integercannotbecasttoclassjava.lang.Long文章目录报错问题解决方法声明报错问题之前在工作中遇到过这个坑,记录一下问题以及解决方法,不一定针对所有情况都能用,但是可以供大家参考。问题描述如下:ForkingPickler(file......
  • 【个人项目互评】 —中小学自动生成试卷程序(Java版)
    本次代码互评我选择的邱文静同学的代码进行互评;下面是我对她的代码的分析:一、题目要求1、命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中三个选项中......
  • javascript数据类型
    原视频:https://www.bilibili.com/video/BV15T411j7pJ?p=9&vd_source=9752cdd43d8570cd76479220c765bc34一、数据类型分类number:数字类型,整型,浮点型,二进制,十六进制(如0x99=十进制的9*16+9=153),八进制,NaNstring:字符串boolean:布尔型truefalseundefined:未定义类型null:空对象unde......