Java中的BIO、NIO与AIO

1.概述

  I/O 模型简单的理解:就是用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能。Java 共支持 3 种网络编程模型 I/O 模式:BIONIOAIO

2.Java BIO

  Java BIO(Blocking I/O):是传统的java io 编程,其相关的类和接口在 java.io。同步并阻塞(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有连接请求时,服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销。

在这里插入图片描述

BIO 编程流程的梳理

  1. 服务器端启动一个 ServerSocket
  2. 客户端启动 Socket 对服务器进行通信,默认情况下服务器端需要对每个客户建立一个线程与之通讯。
  3. 客户端发出请求后,先咨询服务器是否有线程响应,如果没有则会等待,或者被拒绝。
  4. 如果有响应,客户端线程会等待请求结束后,在继续执行。

Java BIO 存在的问题:

  • 每个请求都需要创建独立的线程,与对应的客户端进行数据Read,业务处理,数据 Write 。
  • 当并发数较大时,需要创建大量线程来处理连接,系统资源占用较大。
  • 连接建立后,如果当前线程暂时没有数据可读,则线程就阻塞在 Read 操作上,造成线程资源浪费。

BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中。

3.Java NIO

  Java NIO(java non-blocking IO):同步非阻塞,服务器实现模式为一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有 I/O 请求就进行处理 。NIO 有三大核心部分: Channel(通道)、Buffer(缓冲区)、Selector(选择器) 。NIO面向缓冲区,或者面向块编程的。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动,这就增加了处理过程中的灵活性,使用它可以提供非阻塞式的高伸缩性网络。

在这里插入图片描述
对于NIO的理解:

  • 每个 Channel 对应一个 Buffer,底层是一个数组;
  • Selector 对应一个线程,一个线程对应多个channel,根据不同的事件,在不同的通道上切换;
  • 程序切换到哪个channel 是有事件决定的(accept/read/write);
  • 数据的读取写入是通过Buffer, 这个和BIO , BIO 中要么是输入流,或者是输出流, 不能双向,但是NIO的Buffer 是可以读也可以写, 需要 flip 方法切换

4. Java AIO

  JDK7 引入了 AsynchronousI/O,即 AIO。在进行 I/O 编程中,常用到两种模式:Reactor ProactorJavaNIO 就是 Reactor,当有事件触发时,服务器端得到通知,进行相应的处理。Java AIO(NIO.2):异步非阻塞,AIO 引入异步通道的概念,采用了 Proactor 模式,简化了程序编写,有效的请求才启动线程,它的特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时间较长的应用。

5. BIO VS NIO VS AIO

编程模型BIONIOAIO
IO模型同步阻塞同步非阻塞(多路复用)异步非阻塞
编程难度简单复杂复杂
可靠性
吞吐量

举例说明

  1. 同步阻塞:到理发店理发,就一直等理发师,直到轮到自己理发。
  2. 同步非阻塞:到理发店理发,发现前面有其它人理发,给理发师说下,先干其他事情,一会过来看是否轮到自己.
    理发店理发,发现前面有其它人理发,给理发师说下,先干其他事情,一会过来看是否轮到自己.
  3. 异步非阻塞:给理发师打电话,让理发师上门服务,自己干其它事情,理发师自己来家给你理发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/567913.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

话题——为什么要学习程序,成为程序员呢?

选择成为一名程序员,这对我而言并非是一时冲动,而是深思熟虑后的坚定选择。在当下这个信息化、数字化的时代,程序员这一职业不仅具有极高的技术含量,更承载了推动社会进步、引领科技发展的重任。特别是在深度学习这一前沿领域&…

【六十四】【算法分析与设计】699. 掉落的方块,离散化操作,线段树优化,区间查询sum+区间更新update

699. 掉落的方块 在二维平面上的 x 轴上,放置着一些方块。 给你一个二维整数数组 positions ,其中 positions[i] [left(i), sideLength(i)] 表示:第 i 个方块边长为 sideLength(i) ,其左侧边与 x 轴上坐标点 left(i) 对齐。 每个…

Midjourney如何利用chaos控制生成图片的差异化

hello 小伙伴们,我是你们的老朋友——树下,今天分享Midjourney提示词常用参数——chaos,话不多说,直接开始~ chaos参数什么意思呢? 它可以用来控制我们生成图片之间的差异化程度的一个参数 通常我们在用Midjourney生…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-1.1

前言: 本文是来自哔哩哔哩网站上视频“正点原子[第二期]Linux之ARM(MX6U)裸机篇”的学习笔记,在这里会记录下正点原子Linux ARM MX6ULL 开发板根据配套的哔哩哔哩学习视频所作的实验和笔记内容。本文大量的引用了正点原子哔哔哩网…

服务器 BMC(基板管理控制器,Baseboard Management Controller)认知

写在前面 工作中遇到,简单整理博文内容涉及 BMC 基本认知理解不足小伙伴帮忙指正 不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已经和从前不一样了。——村上春树 基板管理控制器(BMC&…

小米一面:说说MVC与设计模式的关系

前言 大家好,我叫阿杆,不叫阿轩。 先来看看面试环节吧。 面试官:请说说MVC模式是基于哪种设计模式的? 求职者:MVC本身不就是一种设计模式吗? 面试官:我的意思是,MVC是基于23中设计…

SD-WAN为什么在亚太地区普及?

当前,软件定义广域网SD-WAN在亚太地区具有稳固的地位。它看起来是技术与地形的完美结合,因为亚太地区拥有许多大国,其中一些国度辽阔,人口分布在广阔的地理区域和偏远地区,如印度,澳大利亚,越南…

Introducing Meta Llama 3: The most capable openly available LLM to date

要点 今天,我们推出 Meta Llama 3,这是我们最先进的开源大型语言模型的下一代。Llama 3型号将很快在AWS,Databricks,Google Cloud,Hugging Face,Kaggle,IBM WatsonX,Microsoft Azur…

代码随想录算法训练营第四十六天| LeetCode139.单词拆分

一、LeetCode139.单词拆分 题目链接/文章讲解/视频讲解:https://programmercarl.com/0139.%E5%8D%95%E8%AF%8D%E6%8B%86%E5%88%86.html 状态:已解决 1.思路 单词明显就是物品,字符串s明显就是背包,那么问题就变成了物品能不能把背…

Three 银河系

总体效果图 当然,这也只是银河系的一部分,要想知道全景视野下的银河系是什么样的,只有通过科学家依据观测结果所制作的绘图来实现,因为银河系实在是太大了,目前的技术水平还无法实现全景捕捉。绘制的这张三维立体图像…

记录:阿里云服务器网站搭建(4)

Docker安装Nginx 现阶段主要目的是做一些静态资源路径的转发代理,相当于一个web服务器,tomcat也可以设置凡访问静态资源。但考虑到后续还需要作为代理服务器对域名等进行代理转发,所以使用nginx。 准备好要挂载的nginx配置目录 mkdir -p /m…

React-RTK

​🌈个人主页:前端青山 🔥系列专栏:React篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容:React-RTK 目录 1、介绍 2、安装 3、编写RTK使用示例 4、官方提供项目包示例 创建 Redux …

ROS 2边学边练(33)-- 写一个静态广播(C++)

前言 通过这一篇我们将了解并学习到如何广播静态坐标变换到tf2(由tf2来转换这些坐标系)。 发布静态变换对于定义机器人底座与其传感器或非移动部件之间的关系非常有用。例如,在以激光扫描仪中心的坐标系中推理激光扫描测量数据是最简单的。 这…

基于人工智能的机动车号牌检测与推理系统v1.0

基于人工智能的机动车号牌检测与推理系统v1.0代码重构与实现。 目前整合3中现有算法,并完成阶段性改造,包括【传统方法检测车牌,SVM推理字符】、【YOLO方法检测车牌,SVM推理字符】、【YOLO方法检测车牌,CNN推理字符】&…

MapReduce案例-电影网站数据统计分析

本文适合大数据初学者学习MapReduce统计分析业务问题的步骤和基础的MapReduce编程方法,初步掌握Hadoop对计算任务的管理。 本文末尾有全部数据集和完整代码连接。 1.准备工作 安装Hadoop:Hadoop 3.3.2 离线安装-CSDN博客 按照好Hadoop之后要检查一下datanode运行情况…

Llama网络结构介绍

LLaMA现在已经是开源社区里炙手可热的模型了,但是原文中仅仅介绍了其和标准Transformer的差别,并没有一个全局的模型介绍。因此打算写篇文章,争取让读者不参考任何其他资料把LLaMA的模型搞懂。 结构 如图所示为LLaMA的示意图,由…

ESP32学习第一天-ESP32点亮LED,按键控制LED状态,LED流水灯

第一天使用到的函数: 函数第一个参数设置哪一个引脚,第二个参数设置引脚模式。 pinMode(led_pin,OUTPUT); //设置引脚模式 函数的第一个参数设置哪一个引脚,第二个参数设置是高电平还是低电平。 digitalWrite(led_pin,HIGH);//将引脚电平拉高 #incl…

电脑怎么拖动文件到想要的位置?电脑上拖拽没了的文件怎么找回

在日常的办公和学习中,电脑文件拖拽操作是每位用户都不可或缺的技能。然而,有时在拖动文件时,可能会因为误操作或其他原因,导致文件消失或移至未知位置。本文将详细解析如何在电脑上轻松拖动文件到指定位置,并为您提供…

大模型中的位置编码ALiBi,RoPE的总结和实现

目录 Alibi与旋转位置编码的比较 1. Alibi和旋转位置编码的外推性能比较 2. Alibi的处理方式 注意力线性偏置:ALiBi位置编码的实现 1. ALiBi的基本概念 2. ALiBi的实现方式 ALiBi位置编码的代码解读 1. 导入必要的库 2. 定义get_slopes函数 3. 定义get_al…

C++ Primer 总结索引 | 第十三章:拷贝控制

1、类可以定义构造函数,用来控制在创建此类型对象时做什么 类如何控制该类型对象拷贝、赋值、移动或销毁时做什么 类通过一些 特殊的成员函数 控制这些操作,包括:拷贝构造函数、移动构造函数、拷贝赋值运算符、移动赋值运算符 以及 析构函数 …
最新文章