[java八股文][Java基础面试篇]I/O

Java怎么实现网络IO高并发编程?

可以用 Java NIO ,是一种同步非阻塞的I/O模型,也是I/O多路复用的基础。

传统的BIO里面socket.read(),如果TCP RecvBuffer里没有数据,函数会一直阻塞,直到收到数据,返回读到的数据, 如果使用BIO要想要并发处理多个客户端的i/o,那么会使用多线程模式,一个线程专门处理一个客户端 io,这种模式随着客户端越来越多,所需要创建的线程也越来越多,会急剧消耗系统的性能。

image-20240820112641716

NIO 是基于I/O多路复用实现的,它可以只用一个线程处理多个客户端I/O,如果你需要同时管理成千上万的连接,但是每个连接只发送少量数据,例如一个聊天服务器,用NIO实现会更好一些。

image-20240820112656259

BIO、NIO、AIO区别是什么?

  • BIO(blocking IO):就是传统的 java.io 包,它是基于流模型实现的,交互的方式是同步、阻塞方式,也就是说在读入输入流或者输出流时,在读写动作完成之前,线程会一直阻塞在那里,它们之间的调用是可靠的线性顺序。优点是代码比较简单、直观;缺点是 IO 的效率和扩展性很低,容易成为应用性能瓶颈。
  • NIO(non-blocking IO) :Java 1.4 引入的 java.nio 包,提供了 Channel、Selector、Buffer 等新的抽象,可以构建多路复用的、同步非阻塞 IO 程序,同时提供了更接近操作系统底层高性能的数据操作方式。
  • AIO(Asynchronous IO) :是 Java 1.7 之后引入的包,是 NIO 的升级版本,提供了异步非堵塞的 IO 操作方式,所以人们叫它 AIO(Asynchronous IO),异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。

NIO是怎么实现的?

NIO是一种同步非阻塞的IO模型,所以也可以叫NON-BLOCKINGIO。同步是指线程不断轮询IO事件是否就绪,非阻塞是指线程在等待IO的时候,可以同时做其他任务。

同步的核心就Selector(I/O多路复用),Selector代替了线程本身轮询IO事件,避免了阻塞同时减少了不必要的线程消耗;非阻塞的核心就是通道和缓冲区,当IO事件就绪时,可以通过写到缓冲区,保证IO的成功,而无需线程阻塞式地等待。

NIO由一个专门的线程处理所有IO事件,并负责分发。事件驱动机制,事件到来的时候触发操作,不需要阻塞的监视事件。线程之间通过wait,notify通信,减少线程切换。

NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector。传统IO基于字节流和字符流进行操作,而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。

Selector(选择区)用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道。

img

你知道有哪个框架用到NIO了吗?

Netty。

Netty 的 I/O 模型是基于非阻塞 I/O 实现的,底层依赖的是 NIO 框架的多路复用器 Selector。采用 epoll 模式后,只需要一个线程负责 Selector 的轮询。当有数据处于就绪状态后,需要一个事件分发器(Event Dispather),它负责将读写事件分发给对应的读写事件处理器(Event Handler)。事件分发器有两种设计模式:Reactor 和 Proactor,Reactor 采用同步 I/O, Proactor 采用异步 I/O。

img

Reactor 实现相对简单,适合处理耗时短的场景,对于耗时长的 I/O 操作容易造成阻塞。Proactor 性能更高,但是实现逻辑非常复杂,适合图片或视频流分析服务器,目前主流的事件驱动模型还是依赖 select 或 epoll 来实现。

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

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

相关文章

Python常用的第三方模块之【jieba库】支持三种分词模式:精确模式、全模式和搜索引擎模式(提高召回率)

Jieba 是一个流行的中文分词Python库,它提供了三种分词模式:精确模式、全模式和搜索引擎模式。精确模式尝试将句子最精确地切分,适合文本分析;全模式则扫描文本中所有可能的词语,速度快但存在冗余;搜索引擎…

QT6 源(37):界面组件的总基类 QWidget 的源码阅读(下,c++ 代码部分)

(1) QT 在 c 的基础上增加了自己的编译器,以支持元对象系统和 UI 界面设计,有 MOC 、 UIC 等 QT 自己的编译器。本节的源代码里,为了减少篇幅,易于阅读,去除了上篇中的属性部分, 上篇…

rabbitmq-spring-boot-start版本优化升级

文章目录 1.前言2.优化升级内容3.依赖4.使用4.1发送消息代码示例4.2消费监听代码示例4.3 brock中的消息 5.RabbmitMq的MessageConverter消息转换器5.1默认行为5.2JDK 序列化的缺点5.3使用 JSON 进行序列化 6.总结 1.前言 由于之前手写了一个好用的rabbitmq-spring-boot-start启…

git lfs下载大文件限额

起因是用 model.load_state_dict(torch.load())加载pt权重文件时,出现错误:_pickle.UnpicklingError: invalid load key, ‘v’. GPT告诉我:你的 pt 文件不是权重文件,而是模型整体保存(或根本不是 PyTorch 文件&#…

什么是RAG?RAG的主要流程是什么?

**RAG(Retrieval-Augmented Generation)**是一种结合检索与生成技术的框架,旨在通过引入外部知识增强生成模型的性能。其核心思想是:在生成文本时,先从外部知识库中检索相关信息,再将检索结果与原始输入结合,作为生成模型的输入,从而提升生成内容的准确性、相关性和信息…

【Rust 精进之路之第13篇-生命周期·进阶】省略规则与静态生命周期 (`‘static`)

系列: Rust 精进之路:构建可靠、高效软件的底层逻辑 作者: 码觉客 发布日期: 2025年4月20日 引言:让编译器“读懂”你的意图——省略的艺术 在上一篇【生命周期入门】中,我们理解了生命周期的必要性——它是 Rust 编译器用来确保引用有效性、防止悬垂引用的关键机制。我…

Python爬虫实战:获取xie程网敦煌酒店数据并分析,为51出行做参考

一、引言 伴随互联网的飞速发展,在线旅游平台成为人们出行预订酒店的重要途径。xie程网作为国内颇具知名度的在线旅游平台,存有丰富的酒店信息。借助爬取xie程网的酒店数据并加以深入分析,能够为用户提供更为精准的酒店推荐,特别是在旅游旺季,如 51 出行期间。本研究致力…

第二十一讲 XGBoost 回归建模 + SHAP 可解释性分析(利用R语言内置数据集)

下面我将使用 R 语言内置的 mtcars 数据集,模拟一个完整的 XGBoost 回归建模 SHAP 可解释性分析 实战流程。我们将以预测汽车的油耗(mpg)为目标变量,构建 XGBoost 模型,并用 SHAP 来解释模型输出。 🚗 示例…

PyMC+AI提示词贝叶斯项目反应IRT理论Rasch分析篮球比赛官方数据:球员能力与位置层级结构研究

全文链接:tecdat.cn/?p41666 在体育数据分析领域不断发展的当下,数据科学家们致力于挖掘数据背后的深层价值,为各行业提供更具洞察力的决策依据。近期,我们团队完成了一项极具意义的咨询项目,旨在通过先进的数据分析手…

【android bluetooth 框架分析 03】【Bta 层详解 1】【Bluetooth Application Laye 介绍】

蓝牙协议栈中 Bluetooth Application Layer(蓝牙应用层)是协议栈核心组成部分,它位于协议栈中间偏上的位置,主要负责将底层 Bluetooth Stack(如 L2CAP、AVDTP、RFCOMM、SDP 等)与上层 Profile 和 Android F…

单片机获取真实时间的实现方法

单片机获取真实时间(即当前的年月日、时分秒等)通常需要依赖外部时间源或模块,因为单片机本身没有内置的实时时钟(RTC)功能。 在 C 语言环境下,单片机获取真实时间通常需要依赖 外部硬件模块(如…

Linux——进程优先级/切换/调度

1.进程优先级 1.进程优先级是什么:进程获取CPU资源的先后顺序 2.为什么要有进程优先级:因为一般CPU只有一块,资源短缺,所以就需要优先级来确定谁先谁后的问题 3.值越低 进程的优先级越高 ps -l进行查看 UID:user id …

铸铁划线平板:多行业的精密测量工具(北重十字滑台加工厂家)

铸铁划线平板是一种用于精密测量和校准的工具,广泛应用于各个行业。它通常由铸铁制成,表面经过精密加工,能够保证较高的平整度和准确度。铸铁划线平板的主要作用是用来检验工件的平整度和垂直度,也常用于划线、校准和测量工件的平…

Excel/WPS表格中图片链接转换成对应的实际图片

Excel 超链图变助手(点击下载可免费试用) 是一款将链接转换成实际图片,批量下载表格中所有图片的转换工具,无需安装,双击打开即可使用。 表格中链接如下图所示: 操作方法: 1、双击以下图标&a…

STM32---串口通信USART

目录 一、串口通信协议 二、USART模块介绍 (1)移位寄存器 (2)控制电路 (3)波特率 (4)C语言接口 三、串口的引脚初始化 (1)引脚分布表 &…

流程架构是什么?为什么要构建流程架构,以及如何构建流程结构?

本文从:流程架构是什么?为什么要构建流程架构?如何构建流程结构三个方面来介绍。 一、首先,我们来了解流程架构是什么? 流程架构是人体的骨架,是大楼的砌筑,是课本的目录,是流程管理…

网络结构及安全科普

文章目录 终端联网网络硬件基础网络协议示例:用户访问网页 OSI七层模型网络攻击(Hack)网络攻击的主要类别(一)按攻击目标分类(二)按攻击技术分类 网络安全防御 典型攻击案例相关名词介绍网络连接…

同z科技面经

同z科技-2025-4-23 1.自我介绍 个人信息 校园经历 实习经历 项目经历 个人技能掌握 目前学习技术 2.封装缓存工具类怎么封装的 先介绍使用缓存的问题 解决的逻辑 封装的逻辑 应用 缓存穿透: 缓存雪崩: 缓存击穿: https://www…

基于LoRA的Llama 2二次预训练实践:高效低成本的大模型领域适配

引言 近年来,大语言模型(LLM)如Meta的Llama 2系列凭借其强大的生成和理解能力成为NLP领域的核心工具。然而,直接将通用预训练模型应用于垂直领域(如医疗、法律、金融)时,常面临领域知识不足的问…

Python爬虫(2)Python爬虫入门:从HTTP协议解析到豆瓣电影数据抓取实战

目录 一、背景与需求‌二、 Web基础与HTTP协议核心解析‌2.1 HTTP协议:数据交互的基石‌2.2 为何爬虫需理解HTTP协议?‌ 三、 Python爬虫实战:Requests库核心用法‌3.1 安装与环境配置‌3.2 案例1:GET请求抓取豆瓣电影Top250‌3.3…