当前位置: 首页 > news >正文

Java NIO_非阻塞I/O的实现与优化

1. 引言

1.1 背景介绍

随着互联网应用的快速发展,传统的阻塞I/O模型已经无法满足高并发、高性能的需求。Java NIO(Non-blocking I/O)提供了高效的非阻塞I/O操作,使得开发者能够构建高性能的网络应用和文件处理系统。

1.2 Java NIO的重要性

Java NIO通过非阻塞I/O和多路复用机制,显著提高了I/O操作的效率,减少了线程切换的开销,适用于高并发场景。NIO使得单个线程可以管理多个连接,极大地提高了系统的吞吐量和响应速度。

1.3 文章目标与结构概述

本文旨在详细介绍Java NIO的基本概念、核心组件、实现方法、优化技巧以及实际应用案例,帮助读者掌握Java NIO的使用和优化方法。

2. Java I/O基础

2.1 阻塞I/O与非阻塞I/O

2.1.1 阻塞I/O的工作原理

阻塞I/O是一种传统的I/O模型,当一个线程执行I/O操作时,它会被阻塞,直到操作完成。这种方式简单直观,但效率低下,尤其是在高并发场景下,会导致大量的线程处于等待状态。

2.1.2 非阻塞I/O的工作原理

非阻塞I/O允许线程在执行I/O操作时继续执行其他任务,不会被阻塞。这种方式提高了线程的利用率,适用于高并发场景,能够显著提高系统的吞吐量。

2.2 Java I/O模型

2.2.1 BIO(Blocking I/O)

BIO是传统的阻塞I/O模型,每个连接都需要一个独立的线程来处理。这种方式简单直接,但在高并发场景下,线程数量会急剧增加,导致系统资源耗尽。

2.2.2 NIO(Non-blocking I/O)

NIO是Java提供的非阻塞I/O模型,通过多路复用机制,单个线程可以管理多个连接,显著提高了系统的性能和资源利用率。

2.2.3 AIO(Asynchronous I/O)

AIO是异步I/O模型,通过异步操作,线程在发起I/O操作后立即返回,不会被阻塞。这种方式进一步提高了系统的性能和响应速度。

3. Java NIO概述

3.1 NIO的基本概念

Java NIO(New Input/Output)是Java 1.4引入的一套新的I/O API,提供了非阻塞I/O操作和多路复用机制。NIO的核心组件包括Channel、Buffer和Selector。

3.2 NIO的核心组件

3.2.1 Channel

Channel是NIO中的数据通道,用于在字节缓冲区和I/O源(如文件、网络套接字)之间传输数据。常见的Channel类型包括:

  • FileChannel:用于文件的读写操作。
  • DatagramChannel:用于UDP协议的读写操作。
  • SocketChannel:用于TCP协议的读写操作。
  • ServerSocketChannel:用于监听TCP连接请求。

3.2.2 Buffer

Buffer是NIO中的数据缓冲区,用于存储数据。常见的Buffer类型包括:

  • ByteBuffer
  • CharBuffer
  • ShortBuffer
  • IntBuffer
  • LongBuffer
  • FloatBuffer
  • DoubleBuffer

3.2.3 Selector

Selector是NIO中的多路复用器,用于管理多个Channel,单个线程可以监控多个Channel的I/O事件。Selector的主要功能包括:

  • 注册Channel
  • 处理I/O事件

3.2.4 SelectorProvider

SelectorProvider是Selector的提供者,用于创建Selector实例。常见的SelectorProvider包括:

  • DefaultSelectorProvider
  • EPollSelectorProvider

4. Channel与Buffer

4.1 Channel的基本概念

Channel是NIO中的数据通道,用于在字节缓冲区和I/O源之间传输数据。常见的Channel类型包括:

  • FileChannel:用于文件的读写操作。
  • DatagramChannel:用于UDP协议的读写操作。
  • SocketChannel:用于TCP协议的读写操作。
  • ServerSocketChannel:用于监听TCP连接请求。

4.1.1 FileChannel

FileChannel用于文件的读写操作,支持随机访问文件。

RandomAccessFile file = new RandomAccessFile("data.txt", "rw");
FileChannel channel = file.getChannel();

4.1.2 DatagramChannel

DatagramChannel用于UDP协议的读写操作,支持无连接的数据传输。

DatagramChannel channel = DatagramChannel.open();
channel.bind(new InetSocketAddress(9999));

4.1.3 SocketChannel

SocketChannel用于TCP协议的读写操作,支持有连接的数据传输。

SocketChannel channel = SocketChannel.open();
channel.connect(new InetSocketAddress("localhost", 9999));

4.1.4 ServerSocketChannel

ServerSocketChannel用于监听TCP连接请求,支持有连接的数据传输。

ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.bind(new InetSocketAddress(9999));

4.2 Buffer的基本概念

Buffer是NIO中的数据缓冲区,用于存储数据。常见的Buffer类型包括:

  • ByteBuffer
  • CharBuffer
  • ShortBuffer
  • IntBuffer
  • LongBuffer
  • FloatBuffer
  • DoubleBuffer

4.2.1 ByteBuffer

ByteBuffer是最常用的Buffer类型,用于存储字节数据。

ByteBuffer buffer = ByteBuffer.allocate(1024);

4.2.2 CharBuffer

CharBuffer用于存储字符数据。

CharBuffer buffer = CharBuffer.allocate(1024);

4.2.3 ShortBuffer

ShortBuffer用于存储短整型数据。

ShortBuffer buffer = ShortBuffer.allocate(1024);

4.2.4 IntBuffer

IntBuffer用于存储整型数据。

IntBuffer buffer = IntBuffer.allocate(1024);

4.2.5 LongBuffer

LongBuffer用于存储长整型数据。

LongBuffer buffer = LongBuffer.allocate(1024);

4.2.6 FloatBuffer

FloatBuffer用于存储浮点型数据。

FloatBuffer buffer = FloatBuffer.allocate(1024);

4.2.7 DoubleBuffer

DoubleBuffer用于存储双精度浮点型数据。

DoubleBuffer buffer = DoubleBuffer.allocate(1024);

4.3 Channel与Buffer的交互

4.3.1 读取数据

通过Channel读取数据到Buffer中。

ByteBuffer buffer = ByteBuffer.allocate(1024);
int bytesRead = channel.read(buffer);

4.3.2 写入数据

通过Channel将Buffer中的数据写入I/O源。

ByteBuffer buffer = ByteBuffer.allocate(1024);
buffer.put("Hello, NIO!".getBytes());
buffer.flip();
channel.write(buffer);

5. Selector

5.1 Selector的基本概念

Selector是NIO中的多路复用器,用于管理多个Channel,单个线程可以监控多个Channel的I/O事件。Selector的主要功能包括:

  • 注册Channel
  • 处理I/O事件

5.2 Selector的注册与事件处理

5.2.1 注册Channel

通过Selector注册Channel,并指定感兴趣的I/O事件。

Selector selector = Selector.open();
SocketChannel channel = SocketChannel.open();
channel.configureBlocking(false);
SelectionKey key = channel.register(selector, SelectionKey.OP_READ);

5.2.2 处理事件

通过Selector处理注册的Channel的I/O事件。

while (true) {int readyChannels = selector.select();if (readyChannels == 0) continue;Set<SelectionKey> selectedKeys = selector.selectedKeys();Iterator<SelectionKey> keyIterator = selectedKeys.iterator();while (keyIterator.hasNext()) {SelectionKey key = keyIterator.next();if (key.isAcceptable()) {// a connection was accepted by a ServerSocketChannel.} else if (key.isConnectable()) {// a connection was established with a remote server.} else if (key.isReadable

相关文章:

Java NIO_非阻塞I/O的实现与优化

1. 引言 1.1 背景介绍 随着互联网应用的快速发展,传统的阻塞I/O模型已经无法满足高并发、高性能的需求。Java NIO(Non-blocking I/O)提供了高效的非阻塞I/O操作,使得开发者能够构建高性能的网络应用和文件处理系统。 1.2 Java NIO的重要性 Java NIO通过非阻塞I/O和多路…...

代码随想录算法训练营Day51 | 101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿

文章目录 101.孤岛的总面积思路与重点 102.沉没孤岛思路与重点 103.水流问题思路与重点 104.建造最大岛屿思路与重点 101.孤岛的总面积 题目链接&#xff1a;101.孤岛的总面积讲解链接&#xff1a;代码随想录状态&#xff1a;直接看题解了。 思路与重点 nextx或者nexty越界了…...

Games202Lecture 6 Real-time Environment Mapping

RTRT RTRT&#xff08;real time ray tracing): path tracingdenoising PRT PRT (Precomputed radiance transfer):离线预计算&#xff0c;运行时快速内积。 预计算&#xff08;Offline Precomputation&#xff09;&#xff1a; 传输函数&#xff08;Transfer Function&…...

在 Zemax 中使用布尔对象创建光学光圈

在 Zemax 中&#xff0c;布尔对象用于通过组合或减去较简单的几何形状来创建复杂形状。布尔运算涉及使用集合运算&#xff08;如并集、交集和减集&#xff09;来组合或修改对象的几何形状。这允许用户在其设计中为光学元件或机械部件创建更复杂和定制的形状。 本视频中&#xf…...

MySQL知识点总结(十八)

说明你对InnoDB集群的整体认知。 MySQL组复制技术是InnoDB集群实现的基础&#xff0c;组复制安装在集群中的每个服务器实例上。组复制能够创建弹性复制拓扑&#xff0c;在集群中的服务器脱机时可以自动重新配置自己。必须至少有三台服务器才能组成一个可以提供高可用性的组。组…...

[论文总结] 深度学习在农业领域应用论文笔记14

当下&#xff0c;深度学习在农业领域的研究热度持续攀升&#xff0c;相关论文发表量呈现出迅猛增长的态势。但繁荣背后&#xff0c;质量却不尽人意。相当一部分论文内容空洞无物&#xff0c;缺乏能够落地转化的实际价值&#xff0c;“凑数” 的痕迹十分明显。在农业信息化领域的…...

MySQL和Redis的区别

MySQL和Redis都是流行的数据存储解决方案&#xff0c;但它们在设计、用途和特性上有显著区别。理解这些区别有助于选择合适的数据库来满足不同的应用需求。本文将详细介绍MySQL和Redis的区别&#xff0c;包括它们的架构、使用场景、性能和其他关键特性。 一、基本概述 MySQL&…...

Rust 中的注释使用指南

Rust 中的注释使用指南 注释是代码中不可或缺的一部分&#xff0c;它帮助开发者理解代码的逻辑和意图。Rust 提供了多种注释方式&#xff0c;包括行注释、块注释和文档注释。本文将详细介绍这些注释的使用方法&#xff0c;并通过一个示例展示如何在实际代码中应用注释。 1. 行…...

2025年2月2日(tcp3次握手4次挥手)

TCP&#xff08;三次握手和四次挥手&#xff09;是建立和关闭网络连接的标准过程&#xff0c;确保数据在传输过程中可靠无误。下面是详细解释&#xff1a; 1. 三次握手&#xff08;TCP连接建立过程&#xff09; 三次握手是为了在客户端和服务器之间建立一个可靠的连接&#x…...

一文了解制造业中的QC是什么

制造业中的QC QC &#xff1a;Quality Control&#xff0c;品质控制&#xff0c;产品的质量检验&#xff0c;发现质量问题后的分析、改善和不合格品控制相关人员的总称。中文意思是品质控制、质量检验。为达到品质要求所采取的作业技术和活动。有些推行ISO9000的组织会设置这样…...

【NEXT】网络编程——上传文件(不限于jpg/png/pdf/txt/doc等),或请求参数值是file类型时,调用在线服务接口

最近在使用华为AI平台ModelArts训练自己的图像识别模型&#xff0c;并部署了在线服务接口。供给客户端&#xff08;如&#xff1a;鸿蒙APP/元服务&#xff09;调用。 import核心能力&#xff1a; import { http } from kit.NetworkKit; import { fileIo } from kit.CoreFileK…...

在CentOS服务器上部署DeepSeek R1

在CentOS服务器上部署DeepSeek R1,并通过公网IP与其进行对话,可以按照以下步骤操作: 一、环境准备 系统要求: CentOS 8+(需支持AVX512指令集)。 硬件配置: GPU版本:NVIDIA驱动520+,CUDA 11.8+。 CPU版本:至少16核处理器,64GB内存。 存储空间:原始模型需要30GB,量…...

算法随笔_36: 复写零

上一篇:算法随笔_35: 每日温度-CSDN博客 题目描述如下: 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改…...

MoonBit 编译器(留档学习)

MoonBit 编译器 MoonBit 是一个用户友好&#xff0c;构建快&#xff0c;产出质量高的编程语言。 MoonBit | Documentation | Tour | Core This is the source code repository for MoonBit, a programming language that is user-friendly, builds fast, and produces high q…...

使用 DeepSeek-R1 与 AnythingLLM 搭建本地知识库

一、下载地址Download Ollama on macOS 官方网站&#xff1a;Ollama 官方模型库&#xff1a;library 二、模型库搜索 deepseek r1 deepseek-r1:1.5b 私有化部署deepseek&#xff0c;模型库搜索 deepseek r1 运行cmd复制命令&#xff1a;ollama run deepseek-r1:1.5b 私有化…...

网络工程师 (13)时间管理

一、定义与重要性 项目时间管理是指为确保项目按时完成而采取的一系列规划、安排和控制活动。它始于项目启动阶段&#xff0c;贯穿整个项目生命周期&#xff0c;直至项目结束。时间管理对于项目的成功至关重要&#xff0c;它有助于项目团队明确工作目标和时间节点&#xff0c;增…...

【xdoj-离散线上练习】T251(C++)

解题反思&#xff1a; 开始敲代码前想清楚整个思路比什么都重要嘤嘤嘤&#xff01;看到输入m, n和矩阵&#xff0c;注意不能想当然地认为就是高m&#xff0c;宽n的矩阵&#xff0c;细看含义 比如本题给出了树的邻接矩阵&#xff0c;就是n*n的&#xff0c;代码实现中没有用到m这…...

定时器按键tim_key模版

低优先级放在高优先级内势必是程序卡死 把高优先级放到低优先级内&#xff0c;会使程序卡死 可修改 Debuger调试方法 Pwm rcc #include "my_main.h" uint8_t led_sta0x10; char text[30]; void LED_Disp(uint8_t dsLED) {HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPI…...

Kanass快速安装配置教程(入门级)

Kanass是一款国产开源免费的项目管理工具&#xff0c;工具简洁易用、开源免费&#xff0c;本文将介绍如何快速安装配置kanass&#xff0c;以快速上手。&#xfeff; 1、快速安装 1.1 Linux 安装 点击官网 -> 演示与下载 ->下载&#xff0c;下载Linux安装包&#xff0c;…...

无用知识之:std::initializer_list的秘密

先说结论&#xff0c;用std::initializer_list初始化vector&#xff0c;内部逻辑是先生成了一个临时数组&#xff0c;进行了拷贝构造&#xff0c;然后用这个数组的起终指针初始化initializer_list。然后再用initializer_list对vector进行初始化&#xff0c;这个动作又触发了拷贝…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

【HTML】HTML 与 CSS 基础教程

作为 Java 工程师&#xff0c;掌握 HTML 和 CSS 也是需要的&#xff0c;它能让你高效与前端团队协作、调试页面元素&#xff0c;甚至独立完成简单页面开发。本文将用最简洁的方式带你掌握核心概念。 一、HTML&#xff0c;网页骨架搭建 核心概念&#xff1a;HTML通过标签定义内…...

如何安装并使用RustDesk

参考&#xff1a; 搭建 RustDesk Server&#xff1a;打造属于自己的远程控制系统&#xff0c;替代 TeamViewer 和 ToDesk&#xff01; 向日葵、ToDesk再见&#xff01;自己动手&#xff0c;自建RustDesk远程服务器真香&#xff01; 通俗易懂&#xff1a;RustDesk Server的搭…...

Spring Boot微服务架构(十一):独立部署是否抛弃了架构优势?

Spring Boot 的独立部署&#xff08;即打包为可执行 JAR/WAR 文件&#xff09;本身并不会直接丧失架构优势&#xff0c;但其是否体现架构价值取决于具体应用场景和设计选择。以下是关键分析&#xff1a; 一、独立部署与架构优势的关系 内嵌容器的优势保留 Spring Boot 独立部署…...

抖去推--短视频矩阵系统源码开发

一、开发短视频矩阵系统的源码需要以下步骤&#xff1a; 确定系统需求&#xff1a; 根据客户的具体业务目标&#xff0c;明确系统需实现的核心功能模块&#xff0c;例如用户注册登录、视频内容上传与管理、多维度视频浏览与推荐、用户互动&#xff08;评论、点赞、分享&#xf…...

每日一令:Linux 极简通关指南 - 汇总

专栏列表 &#x1f4bb; 每日一令&#xff1a;Linux 极简通关指南 (25篇) 【基础】每天掌握一个Linux命令 - nsenter&#xff1a;深入容器与命名空间的利器 发布于 2025-06-08 22:27:04【基础】 每天掌握一个Linux命令 - journalctl&#xff1a;系统日志管理的得力助手 发布于…...

免费批量去水印工具 - 针对文心一言生成图片

免费批量去水印工具 - 针对文心一言生成图片 工具介绍 这是一款免费的批量去水印工具&#xff0c;专门针对文心一言生成的图片进行处理。通过简单的操作&#xff0c;您可以快速去除图片中的水印。 下载链接 您可以通过以下网盘链接下载工具&#xff1a; 链接: https://pa…...