【BIO、NIO、AIO适用场景分析】

BIO、NIO、AIO适用场景分析

  • 1.适用场景:
  • 2.BIO基本介绍
    • 2.1 BIO示例
  • 3.Java NIO基本介绍
    • 3.1 NIO中三个核心部分:
    • 3.2 NIO非阻塞
    • 3.3 buffer案例
    • 3.4 比较

1.适用场景:

  1. BIO方式适用于连接数目比较少且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用之内,jdk1.4以前的唯一选择,但程序简单易理解。
  2. NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,弹幕系统,服务器间通讯等。编程比较复杂,jdk1.4开始支持。
  3. AIO方式适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用os参与并发操作,编程比较复杂,jdk7开始支持。

2.BIO基本介绍

  • Java BIO 就是传统的java io编程,其相关的类和接口在java.io
  • BIO (blocking io):同步阻塞,服务器的实现模式是一个连接一个线程,即客户端有连接请求时服务器就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制改善(实现)。
  • BIO 方式适用于链接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,jdk1.4以前的唯一选择,程序简单易理解。

2.1 BIO示例

实例说明:

  1. 使用BIO模型编写一个服务器端,监听6666端口,当有客户端连接时,就启动一个线程与之通讯。
  2. 要求使用线程池机制改善,可以连接多个客户端。
  3. 服务端可以接收客户端发送的数据(telnet方式即可)

server端,client端使用os的telnet

// 创建线程池// 如果有客户端连接了,就创建一个线程与之通讯(单独写一个方法)ExecutorService threadPool= Executors.newCachedThreadPool();
// 创建serversocket
ServerSocket socket = new ServerSocket(6666);
while(true) {// 监听, 等待客户端连接final Socket socket = serverSocket.accept(); // 会阻塞①System.out.println("连接到了一个客户端");// 创建一个线程,与之通讯threadPool.execute(()-> {// 重写run,可以和客户端通讯})
}// 编写handler方法,和客户端通讯
public static void handler(Socket socket) {try {System.out.println("线程信息 id:" + Thread.currentThread().getId()+"名称=" + Thread.currentThread().getName());byte[] bytes = new Byte[1024];// 通过socket获取一个输入流InputStream is = socket.getInputStream();// 循环读取客户端发送的数据while(true) {int read = is.read(bytes); // 也会阻塞②if(read != -1) {System.out.println(new String(bytes, 0, read, Charset.UTF-8));// 输出客户端发送的数据} else {break;}}} catch(Exception e) {e.printStackTrace();}finally {System.out.println("关闭client的连接");try {socket.close();} catch(Exception e) {e.printStackTrace();}}
}

问题:

  1. 每个请求都需要创建独立的线程去响应客户端
  2. 当并发量较大时,需要创建大量线程来处理连接,系统资源占用较大。
  3. 连接建立后,如果当前线程暂时没有数据可读,则线程就阻塞在read操作上,造成线程资源浪费。

3.Java NIO基本介绍

3.1 NIO中三个核心部分:

  • Channel(通道)
  • Buffer(缓冲区)
  • Selector(选择器)

NIO是面向缓存区的,或者面向块 编程。

在这里插入图片描述

3.2 NIO非阻塞

  • 通俗地说,NIO是可以做到用一个线程来处理多个操作的。假设有10000个请求过来,根据实际情况,可以分配50或100个线程来处理,不像之前的阻塞io那样,非得分配10000个。
  • Http2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比http1.1大了好几个数量级。

3.3 buffer案例

public class BasicBuffer {public static void main(String[] args) {// 创建一个buffer,大小为5,即可以存放5个int类型数据IntBuffer intBuf =  IntBuffer.allocate(5);// 向buffer中存放数据//buf.put(10);//buf.put(11);for(int i = 0; i < buf.capacity(); i ++ ) {buf.put(i * 2);}// 将buf转换,读写切换buf.flip();while(buf.hasRemaining()) {System.out.println(bug.get()); // 0,2, 4, 6, 8}}
}

3.4 比较

  • BIO 是以流的方式处理数据,而NIO以块的方式处理数据,块I/O的效率比流I/O高很多
  • BIO是阻塞的,NIO是非阻塞的。
  • BIO是基于字节流和字符流进行操作的,而NIO基于Channel(通道)和Buffer(缓存区)进行操作,数据总是从通道读取到缓存区中,或者从缓存区写入到通道中。Selector(选择器)用于监听多个通道的事件,比如(连接请求,数据到达等),因此单个线程就可以监听多个客户端通道。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java对象拷贝的浅与深:如何选择?

在日常开发中&#xff0c;我们经常需要将一个对象的属性复制到另一个对象中。无论是使用第三方工具类还是自己手动实现&#xff0c;都会涉及到浅拷贝和深拷贝的问题。本文将深入讨论浅拷贝的潜在风险&#xff0c;并给出几种实现深拷贝的方式&#xff0c;帮助大家避免潜在的坑。…

gin 通过 OpenTelemetry 实现链路追踪

相关阅读:https://juejin.cn/post/7275550548946337829https://juejin.cn/post/7275550548946337829 OpenTelemetry 是 Cloud Native Computing Foundation (CNCF) 下的一个开源项目,旨在标准化遥测数据的生成和收集;遥测数据包括日志、指标和跟踪。 Gin 是一个用 Go (Gol…

69页PPT全面预算管理体系的框架与落地

一、明确企业战略目标企业战略目标是预算指标体系确立的根本出发点。它为预算指标的设定提供了方向和指导。 深入分析企业长期发展规划 企业需要对自身的长期发展规划进行全面、深入的分析。这包括对市场趋势、行业竞争态势、技术发展方向等外部环境因素的研究&#xff0c;以…

从API到应用:直播美颜SDK如何助力主播美颜工具开发

美颜SDK&#xff08;软件开发工具包&#xff09;作为一套强大的工具&#xff0c;能够帮助开发者快速构建美颜功能。通过集成API&#xff0c;开发者可以实现复杂的实时美颜效果&#xff0c;助力主播美颜工具的开发和应用。 一、美颜SDK的基本功能 美颜SDK是一套为开发者提供的…

【2024高教社杯全国大学生数学建模竞赛】B题模型建立求解

目录 1问题重述1.1问题背景1.2研究意义1.3具体问题 2总体分析3模型假设4符号说明&#xff08;等四问全部更新完再写&#xff09;5模型的建立与求解5.1问题一模型的建立与求解5.1.1问题的具体分析5.1.2模型的准备 目前B题第一问的详细求解过程以及对应论文部分已经完成&#xff…

中国生态环境胁迫数据(栅格/县域尺度)-为研究生态环境压力提供数据支撑

中国生态环境胁迫矢量数据&#xff08;2000-2010年&#xff09; 数据介绍 2000-2010年中国生态环境胁迫数据为2000-2010年中国范围内人口、农业生产等生态环境胁迫因子的空间分布图&#xff0c;包括人口密度、农药使用强度、化肥施用强度。数据可用于分析全国生态环境胁迫因子…

QT笔记 - QProcess读取外部程序(进程)消息

简要介绍 QProcess可用于在当前程序中启动独立的外部程序(进程)&#xff0c;并进行通讯&#xff0c;通讯原理是通过程序的输入或输出流&#xff0c;即通过c中的printf()和或c的std::cout等。 函数 void QProcess::start(const QString & program, const QStringList &am…

系统分析师7:数学与经济管理

文章目录 1 图论应用1.1 最小生成树1.2 最短路径1.3 网络与最大流量 2 运筹方法2.1 线性规划2.2 动态规划2.2.1 供需平衡问题2.2.2 任务指派问题 3 预测与决策3.1 不确定型决策分析3.2 风险型决策3.2.1 决策树3.2.2 决策表 4 随机函数5 数学建模 1 图论应用 ①最小生成树 连接…

Android 存储之 SharedPreferences 框架体系编码模板

一、SharedPreferences 框架体系 1、SharedPreferences 基本介绍 SharedPreferences 是 Android 的一个轻量级存储工具&#xff0c;它采用 key - value 的键值对方式进行存储 它允许保存和读取应用中的基本数据类型&#xff0c;例如&#xff0c;String、int、float、boolean …

解决Type-C接口供电难题:LDR6328取电协议芯片的关键作用

在智能设备快速发展的今天&#xff0c;Type-C接口因其便捷性、高速传输能力和双向充电功能&#xff0c;已成为众多设备的标准接口。然而&#xff0c;随着设备功率需求的不断提升&#xff0c;Type-C接口的供电难题也日益凸显。为解决这一难题&#xff0c;LDR6328取电协议芯片应运…

HTB-Pennyworth(cve查询 和 exp使用)

前言 各位师傅大家好&#xff0c;我是qmx_07,今天给大家讲解Pennyworth靶场 渗透过程 信息搜集 服务器端口开放了8080http端口 访问网站 服务器使用jenkins cms系统&#xff0c;版本是2.289.1 通过弱口令爆破&#xff0c;账户是root,密码是password 通过命令执行nday 连…

2.1ceph集群部署准备-硬件及拓扑

硬件配置及建议 时至今日&#xff0c;ceph可以运行在各种各样的硬件平台上&#xff0c;不管是传统的x86架构平台(intel 至强系列、基于amd的海光系列等)&#xff0c;还是基于arm的架构平台(比如华为鲲鹏)&#xff0c;都可以完美运行ceph集群&#xff0c;展现了其强大的适应能力…

结合AI图片增强、去背景,如何更好的恢复旧照片老照片?

随着数字时代的到来&#xff0c;我们越来越依赖于技术来保存和恢复珍贵的记忆。在众多技术中&#xff0c;人工智能&#xff08;AI&#xff09;在恢复旧照片方面展现出了其独特的魅力和潜力。AI不仅能够修复破损的照片&#xff0c;还能够增强图像质量&#xff0c;让那些褪色的记…

WPS中JS宏使用说明(持续优化...)

前言 好久没发文章了&#xff0c;今天闲来无事发篇文章找找之前的码字感觉。 正文 最近在写教案&#xff0c;发现之前的技术又可以派上用场了。就是JS&#xff0c;全称JavaScript&#xff0c;这个语言太强大了&#xff0c;我发现WPS里的宏现在默认就是JS。功能选项如下图&…

开源模型应用落地-qwen2-7b-instruct-LoRA微调合并-ms-swift-单机单卡-V100(十三)

一、前言 本篇文章将使用ms-swift去合并微调后的模型权重&#xff0c;通过阅读本文&#xff0c;您将能够更好地掌握这些关键技术&#xff0c;理解其中的关键技术要点&#xff0c;并应用于自己的项目中。 二、术语介绍 2.1. LoRA微调 LoRA (Low-Rank Adaptation) 用于微调大型语…

算法练习题14——leetcode84柱形图中最大的矩形(单调栈)

题目描述&#xff1a; 解题思路&#xff1a; 要解决这个问题&#xff0c;我们需要找到每个柱子可以扩展的最大左右边界&#xff0c;然后计算以每个柱子为高度的最大矩形面积。 具体步骤如下&#xff1a; 计算每个柱子左侧最近的比当前柱子矮的位置&#xff1a; 使用一个单调…

vue3获取视频时长、码率、格式等视频详细信息

前言&#xff1a; 我们在上传视频需要视频的帧数等信息的时候&#xff0c;上传组件无法直接读取帧数等信息 方法&#xff1a;通过mediainfo.js来获取视频的帧率、总帧数和视频的总时长 mediainfo.js地址&#xff0c;想详细了解的可以去看看git地址&#xff1a;https://githu…

【最新华为OD机试E卷-支持在线评测】查找充电设备组合(200分)-多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-E/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,…

【机器学习-神经网络】循环神经网络

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

软件测试基础总结+面试八股文

一、什么是软件&#xff1f; 软件是计算机系统中的程序和相关文件或文档的总称。 二、什么是软件测试&#xff1f; 说法一&#xff1a;使用人工或自动的手段来运行或测量软件系统的过程&#xff0c;以检验软件系统是否满足规定的要求&#xff0c;并找出与预期结果之间的差异…