【NIO】1. 基础概念

Java NIO概念 I/O多路复用(I/O Multiplexing)是一种在单个线程或进程中同时管理多个I/O操作的技术,特别适用于需要同时处理多个输入输出通道的场景,如网络服务器处理多个客户端连接。这项技术允许程序监视多个文件描述符(例如,网络套接字、管道、常规文件等),等待其中的一个或多个变为“就绪”状态(即可以进行读取或写入操作),而无需为每个描述符分配单独的线程或进程。I/O多路复用的核心优势在于它减少了系统中线程或进程的数量,从而降低了资源消耗和上下文切换的开销,提高了系统在高并发环境下的性能和可扩展性。 阅读详情

NIO

Non Blocking IO,非阻塞IO;
也有人或教材理解为New IO;

三大组件

1. Channel

1.1 基本概念

顾名思义,是数据的传输通道;

  • Channel类似于Java BIO的【InputStream】和【OutputStream】,是读写数据的通道,可以从Channel将数据读入buffer,也可以将buffer的数据写入Channel,而Stream要么是输入(InputStream),要么是输出(OutputStream),channel比stream更为底层。

  • Java IO中的输入流和输出流,也是数据的传输通道,只不过他们是单向的。输入流InputStream只能从文件或者网络中读取数据到程序,输出流OutputStream只能从程序向文件或者网络中输出数据。而Channel是读写数据的双向通道。

1.2 常见的Channel:

FileChannel,用于文件操作;
DatagramChannel,专用于udp网络编程;
SocketChannel,专用于tcp;
ServerSocketChannel,专用于tcp服务端;

2. Buffer

2.1 基本概念

从Channel中读取到的数据,要先缓存到内存中,Buffer就是这样的缓冲区,用来暂存数据;反之,向Channel中写出数据之前,也要将数据放到Buffer中。

2.2 常见的Buffer

最常用的是ByteBuffer

在这里插入图片描述

3. Selector

selector字面意思为选择器,选择什么呢?不太好理解,需要结合服务器端的代码设计来理解selector。

在java nio这套API出现之前,服务器端程序是怎样设计的呢?

3.1 早期服务器端程序设计思路

3.1.1 多线程

服务器要处理与多个客户端的通信,一个客户端,在代码层面,表现为一个Socket。
客户端一旦与服务器建立连接,就会创建Socket对象,将来两端就通过这个Socket进行数据读写(通过java IO输入输出流)。

每个Socket,服务器会专门启动新的线程来处理。如果有多个客户端,那么服务器就要创建多个线程,每个线程专门处理一个Socket。

这种思路的缺点:

  1. 连接数少的时候,这种思路没问题;但是如果有大批量的客户端连接上来,就需要创建大量线程;线程本身就会占用一定的资源,如果线程数过多,就会占用过多内存资源;
  2. 线程虽然有很多,但是cpu核心是有限的;线程内的代码最终还是要靠cpu执行。
    比如cpu有16个核心,那么真正能同时执行的只有16个线程,其他的线程不得不等待。
    线程等待的时候,会保存线程当前的状态。当轮到这些线程执行的时候,就会进行线程上下文切换。上下文切换过于频繁,效率也不会很高。

因此,该方案仅适合连接数少的场景。

3.1.2 线程池

第一种思路的主要问题是:线程数一旦增多,就会导致内存资源占用过多,线程上下文切换成本变高。那么是否可以用线程池来限制线程的数量呢?

Java Socket API工作在【阻塞模式】,阻塞模式下,线程同一时间只能处理一个Socket连接的读写操作。比如一个客户端连接到服务器,那么线程开始处理与该客户端的Socket读写操作,在该客户端断开连接之前,线程都只能处理该客户端的Socket,哪怕此时该Socket已经没有读写操作发生,线程也只能干等着,不能去处理其他客户端的Socket。

这就是线程池版的局限性。所以早期的服务器都是设计成短连接,客户端连上之后,做完一项业务处理,赶紧把连接断开,让线程去处理下一个客户端。

早期的tomcat,就是线程池+阻塞IO,适合HTTP 1.0。

因此,该方案仅适合短连接的场景。

3.1.3 Selector

socket、channel、connection,这些都可以代表服务端和客户端的连接对象;

在这里插入图片描述

  1. selector的作用就是配合【一个线程】来管理【多个channel】,获取channel上发生的事件,这些channel工作在【非阻塞模式】下,不会让线程吊死在一个channel上。适合连接数多,但是流量低的场景(low traffic)

  2. selector可以监测到所有channel上发生的事件,当事件发生时,就让线程处理事件。

  3. 如果一个channel的处理时间很长 那么其他channel 得一直等待

  4. 线程池版的话 即使socket不做任何事情 线程也得阻塞在这里什么也做不了 但是现在channel没事件线程就可以处理其他channel,提高了线程的利用率。

合肥-NIO蔚来汽车JAVA开发 面试一面电话二面视频(需要写代码)视频一视频二视频三 一面电话 时长:30分钟 实际:25分钟的样子 难度:一般 Nacos注册中心原理 从raft选举到pull、push整个流程 Dubbo调用原理 首先跟面试官说了dubbo怎么把服务注册到nacos中,再到从nacos中获取注册服务列表,调用的几种方式和负载均衡算法 Dubbo中3个消费者、4个提供者共建立了多少个连接 这个题回答了好久,主要是前面问了nacos,还以为dubbo跟nacos建立了多少链接,后面面试官说消费者和提供 阅读详情

相关推荐

22 SocketIO网络编程基础概念(BIO、NIO、AIO)

1.1 socket基本概念Socket又称“套接字”,应用程序通常通过“套接字”向网络发出请求或者应答网络请求Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,socket是建立网络连接使用的。在连接成功的时候,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,不因为在服务器端或者...

Vision 792

Java NIO 入门学习(过门)

Java NIO(New IO) 还是在 JDK 1.4 中引入的新特性。JDK 1.4 的另一重要特性正则表达式大家应该经常用到,但 NIO 就可能使用寥寥了,大概是缘于旧有 IO 体系仍然够用。有如 JDK1.5 早就泛型和注解了,但基于各种原因而无法亲力去实践泛型和注解一般,NIO 多数时候也只是与我们擦着肩而已。相比与 Old IO,NIO 在某些领域里确有其过人之处,所以现在让我们一起来

hlf48641715的专栏 946

Jupyter Notebook 命名出现“error”且运行后没反应

Jupyter Notebook 命名出现“error”且运行后没反应提前声明错误截图(方便大家看看是不是自己的错误)解决方法 提前声明 我的问题是在看到答主 @开始King的回答后才解决的,因为答主大大的文章后面有些地方不是很详细,我在这里再在King大大的基础上完善一下子 错误截图(方便大家看看是不是自己的错误) 1.命名失败,上面出现一个“error”字样 2.运行失败,无论是点击上方的运行按钮还是按快捷键shift+enter 都只会向下再增加一个代码块,而不会运行程序。 (也不是很多人出现的[*

qq_52770743的博客 1万+

行业分析---造车新势力之蔚来汽车

蔚来汽车(NIO)是一家智能电动汽车品牌,成立于2014年11月,总部位于中国上海。蔚来汽车由李斌等企业家联合创立,并获得了淡马锡、百度资本、红杉、联想集团、华平、TPG、GIC、IDG、愉悦资本等数十家知名机构的投资(目前的主要持股机构:阿布扎比投资和腾讯投资)。作为中国新能源汽车市场的重要参与者,蔚来汽车致力于通过创新技术和卓越的用户体验,引领全球智能电动汽车产业的发展。2018年9月,蔚来汽车成功登陆纽交所。蔚来汽车的主营业务涵盖了高端电动汽车的研发、生产和销售。

智能汽车人的博客 2274

深度学习【46】pix2pixHD

英伟达的pix2pixHD,能够合成高清的2048*1024图片,简直振奋人心。pix2pixHD是我之前介绍过的pix2pix的改进版本,使用多由粗到精的G网络和多尺度D网络(每个D网络都是用了pix2pix中同样的patch技术)。论文一开始用pix2pix尝试合成更高分辨率的图片,但发现效果不好,训练也很不稳定。所以就对pix2pix进行了一顿魔改。我们来看看他们是怎么改进的。由粗到精的G网络

DCD_LIN的博客 1万+

信捷XDH PLC多轴运动控制实战:Ethercat总线下的C语言封装技巧

本文深入探讨了在信捷XDH PLC平台上,如何利用C语言对EtherCAT总线多轴运动控制进行高效封装。通过设计全局数据池、模块化状态机及用户友好接口,将底层复杂的运动控制函数库抽象为清晰、可复用的高级模块,显著提升程序稳定性与可维护性,并分享了关键的实战避坑经验。

weixin_29188043的博客 160

netty-第一部分-NIO-1 NIO的三个核心概念

学netty之前,先来看看netty实现的基础NIO

保存我对一些技术的思考 1198

MR2数据集实战:5步搞定多模态谣言检测模型训练(附完整代码)

本文详细介绍了如何使用MR2多模态数据集构建高精度谣言检测系统,涵盖环境配置、数据准备、多模态特征工程、模型架构设计、训练调优及部署优化等5个关键步骤。通过双线性融合技术处理文本、图像和网页三模态数据,解决特征对齐和模态冲突等工程难题,并提供完整代码实现和性能优化方案。

weixin_42657024的博客 239

Java NIO学习(一)NIO相关概念

Netty 与NIONetty在各种应用场合听过无数次了,对它的了解也仅局限于知道Netty是一个NIO的框架,可以用于开发分布式的Java程序。网络编程正好也是自己比较薄弱的环节,所以需要好好整理一下散落的知识点,为学习Netty打好基础,所以觉得有必要重新学习一下NIO。BIO、NIO、AIO按照以往的认知,NIO是Java4以后才出现的一种非阻塞式IO,这是与之前存在的BIO(Blocking

lhxaiee123的博客 1521

QGroundControl高级配置与自定义功能实战指南

本文深入探讨了QGroundControl(QGC)的高级配置与自定义功能,为无人机开发者、系统集成商和高级用户提供实战指南。内容涵盖从品牌界面定制、自定义MAVLink消息处理,到插件开发与自动化部署的全流程,旨在帮助用户解锁QGC的隐藏潜力,打造专属的行业解决方案。

weixin_29234509的博客 239

Habitat-baselines v0.1.7防踩坑手把手带你跑通(全网唯一)

Habitat-baselines v0.1.7防踩坑手把手带你跑通(全网唯一)

shannanshouyin的博客 1276

Java NIO 总结: NIO技术基础回顾

Java NIO是Java 1.4版本引入的一套新的IO API,它提供了非阻塞IO操作的功能,支持面向缓冲区的、基于通道的IO操作。Java NIO的核心组件包括Channels、Buffers和Selectors。

码到三十五 1560

基于ROS与Gazebo的多机器人三角形编队仿真实践

本文详细介绍了基于ROS与Gazebo的多机器人三角形编队仿真实践,从环境搭建到编队控制的全过程。通过TurtleBot3机器人模型和TF坐标系系统,实现三个机器人的三角形编队控制,适用于机器人协同作业与编队算法研究。

weixin_29313817的博客 187

Nio基础之position,limit概念

Nio的基本概念:https://baike.baidu.com/item/java.nio/5180052?fr=aladdin 百度百科 本处仅演示下Buffer的几个概念和Api; 以ByteBuffer缓冲区为例; 创建缓冲区 ByteBuffer bb = ByteBuffer.allocate(10); bb.position(); 代表的是数据指针的位置; bb.cap...

wf_feng的博客 1405

【YOLOv8改进-注意力机制】LSKNet(Large Selective Kernel Network ):空间选择注意力

【YOLOv8改进-注意力机制】LSKNet(Large Selective Kernel Network ):空间选择注意力 (论文笔记+引入代码)。LSKNet能够动态调整其大的空间接收场,以更好地模拟遥感场景中各种对象的范围上下文。据我们所知,这是首次在遥感目标检测领域探索大型和选择性核机制。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 2864

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

NIO基础-Selector,Nio概念

NIO基础-Selector,Nio概念

Filwaod 645

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JAVA NIO(1.基本概念,基本类)

JAVA NIO 目录 1.入门2.相关接口和类 2.1 ByteBuffer 2.2 Channel,FileChannel 2.3 多路IO 2.4 异步IO 2.5其他3.实例入门NIO的整体说明:Java NIO 是Java新的IO类库(相对于旧IO来说),它的目的是提高速度.虽然旧IO已经使用NIO重新实现过,但是显示使用NIO对于文件IO和网络IO的速度还是有很大提升.NI

随心的专栏 4212

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Java NIO核心概念总结篇

最近学习Java NIO的相关知识,为了以后方便复习,记录下主要知识点。 参考来源:某视频中的讲解以及一些博文,见文章结尾。 一、Java NIO基本介绍 Java NIO(New IO,也有人叫:Non Blocking  IO)是从Java1.4版本开始引入的一个新的IO API,其与原来的IO有同样的作用和目的,但是使用方式有很大的差别。NIO是为提供I/O吞吐量而专门设计,其卓越的性...

Java学习 1697

蔚来汽车的财务报告分析,自研分享蔚来汽车的财务报告分析,自研分享

提供一些关于蔚来汽车财务报告分析的框架,但请注意这不是专业的财务建议。

百态·数智思维 | 聚焦大数据、量化与未来AI 1533

NIO流的一些概念

NIO流NIO概述Buffer缓冲区Channel通道获取FileChannel对象 NIO概述 Buffer缓冲区 Channel通道 CharSet字符集 NIO相关工具类Paths/Path/Files 使用NIO遍历文件 使用NIO监控文件系统变化 NIO概述 1.NIO是面向块(缓冲区)编程,旧IO是面向流编程。NIO是在JDK1.4后引入的 2.NIO 和 IO的区别:IO是面向流、阻...

Ariqiao的博客 506

Apache Flink 在蔚来汽车的应用

Flink 在蔚来汽车实时计算平台、实时看板、CDP、实时数仓等场景的应用

Ververica的博客 2228

蔚来汽车出海

​配图来自Canva可画 过去一年在新冠疫情剧烈冲击之下,新能源汽车市场却依然实现了逆势突围。不只是特斯拉,国内的比亚迪以及在美股上市的蔚来、小鹏、理想等造车新势力,也都迎来了自己的高光时刻。 蔚来更是凭借其拉来的融资和出色的业绩,坚定了资本市场的信心,使其股价在短短一年之内迅速暴涨20倍以上,上演了绝地逆袭的神话。有了过去一年的业绩打底,2021年蔚来在延续增长这件事上,表现的更加如鱼得水了。 营收、毛利双增长 4月30日,蔚来对外公布了2021年第一季度财报。财报数据显示,2021年第一季度蔚.

liukuang110的博客 439

Java进阶篇之NIO基础

阻塞模式:BIO 采用流式处理,读取或写入数据时必须等待操作完成,线程可能被阻塞。线程消耗大:每个连接通常对应一个独立的线程,在高并发场景下,线程资源消耗过多,导致性能下降。数据复制:BIO 需要频繁在用户空间和内核空间之间拷贝数据,影响 I/O 性能。Java NIO 是高性能 I/O 编程的基础,适用于高并发、低延迟的应用场景。本文介绍了 NIO 的基本概念、核心组件(Buffer、Channel、Selector)及代码示例,希望能帮助你更好地理解 NIO 的应用。

code2cat的博客 986

【Java】NIO及核心概念

Buffer 是一个容器,用于与 Channel 交互的数据。开始提供的一套新 I/O API,它与传统的。Selector 是 NIO 的核心,用于。,非常适合高并发网络应用。

改变的博客 1012

Java NIO 通信基础详解

在1.4 版本之前,Java IO 类库是阻塞IO,从1.4版本开始,引进了新的异步IO库,被称为Java New IO类库,简称为Java NIO ,New IO 类库的目标,就是要让Java 支持非阻塞IO ,基于这个原因,更多的人喜欢称Java NIO为非阻塞IO(Non Block IO) ,称为老的 阻塞式 Java IO 为 OIO或者是BIO , 总体来说,NIO 弥补了原来面向流的OIO 同步阻塞的不足,它的标准Java 代码提供了调整,面向缓冲区IO。

用心做文章,说人话 1075

NIO基础

这样,一个单独的线程可以通过轮询 Selector 来判断一组 Channel 是否有就绪状态的事件,从而只需要少量的线程就能处理大量的客户端请求。,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 stream 要么是输入,要么是输出,channel 比 stream 更为底层。它与数组类似,但是提供了对数据的结构化访问,并且可以跟踪已经读写了多少数据。Buffer 是一块可以写入数据,然后可以从中读取数据的内存块。

我的博客 1505
上一篇: 填充word文档【Apache POI】
下一篇: 【NIO】2. ByteBuffer的基本使用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值