Java NIO 高并发开发
Java NIO 高并发开发
前言
Java NIO(New I/O)相比于传统的Java I/O(BIO)在高并发开发方面具有以下优势:
非阻塞模式:Java NIO使用非阻塞的I/O操作,允许一个线程管理多个通道(Channel),并且在没有数据可读写时不会阻塞线程。这意味着一个线程可以同时处理多个连接,而不需要为每个连接创建一个独立的线程,从而大大减少了线程的数量和上下文切换的开销。
选择器(Selector):Java NIO提供了Selector机制,通过Selector可以同时监控多个通道的事件(如可读、可写、连接等)。一个Selector可以管理多个通道,通过单个线程监听多个通道上的事件,避免了为每个通道创建独立线程的开销。
缓冲区(Buffer):Java NIO使用缓冲区进行数据的读写操作,通过将数据从通道读取到缓冲区中,或者将数据从缓冲区写入到通道中,可以提高数据的处理效率。此外,缓冲区还可以进行批量读写操作,减少了系统调用的次数,提高了性能。
零拷贝(Zero-copy):Java NIO支持零拷贝技术,即数据在内核空间和用户空间之间的传输可以避免数据的拷贝。在传统的Java I/O中,数据需要从内核缓冲区拷贝到用户缓冲区,然后再进行处理,而Java
NIO可以直接在内核缓冲区和用户缓冲区之间进行操作,减少了数据拷贝的开销。综上所述,Java
NIO通过非阻塞模式、选择器、缓冲区和零拷贝等特性,使得一个线程可以同时管理多个通道,大大提高了系统的并发性能。相比于传统的Java
I/O,它能更有效地利用系统资源,减少线程数量和上下文切换的开销,适用于高并发的网络应用程序开发。然而,需要注意的是,Java
NIO相对复杂,需要处理多线程同步、数据一致性等问题,因此在使用时需要谨慎处理各种可能的事件和异常情况。
在我发这篇文章之前,我已经发过NIO的基础用法和全套NIO用法,可以看之前我发的文章Java NIO 和Java NIO 开发
一,Java NIO 高并发示例代码模板
当然,我会为你提供带有注释的Java NIO高并发开发示例代码。以下是一个考虑到并发、线程安全、锁竞争、异常处理、线程池配置和内存管理的示例代码:
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class NIOConcurrencyExample {private static final int BUFFER_SIZE = 1024;private static final int THREAD_POOL_SIZE = 10;public static void main(String[] args) throws IOException {// 创建 Selector 对象Selector selector = Selector.open();// 创建 ServerSocketChannel 并绑定端口ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();serverSocketChannel.bind(new InetSocketAddress(8080));serverSocketChannel.configureBlocking(false);serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);// 创建线程池ExecutorService executorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);while (true) {// 等待就绪的通道int readyChannels = selector.select();if (readyChannels == 0) {continue;}// 获取就绪通道的 SelectionKey 集合Set<SelectionKey> selectedKeys = selector.selectedKeys();Iterator<SelectionKey> keyIterator = selectedKeys.iterator();while (keyIterator.hasNext()) {SelectionKey key = keyIterator.next();if (key.isAcceptable()) {// 接受新的客户端连接请求ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel();SocketChannel clientChannel = serverChannel.accept();clientChannel.configureBlocking(false);clientChannel.register(selector, SelectionKey.OP_READ);} else if (key.isReadable()) {// 处理读取事件的线程executorService.execute(() -> {try {SocketChannel clientChannel = (SocketChannel) key.channel();ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);int bytesRead = clientChannel.read(buffer);// 处理读取到的数据while (bytesRead > 0) {buffer.flip();// TODO: 处理数据逻辑buffer.clear();bytesRead = clientChannel.read(buffer);}if (bytesRead == -1) {clientChannel.close();}} catch (IOException e) {e.printStackTrace();}});}keyIterator.remove();}}}
}
这个示例代码中,我添加了详细的Java注释,以解释代码的功能和关键部分。请注意,注释中的TODO标记表示您需要根据实际需求添加适当的业务逻辑。
此示例代码考虑了以下方面:
- 并发和线程安全:使用线程池来处理客户端的读取操作,确保多个客户端可以并发处理而不会阻塞主线程。
- 锁竞争:由于使用了线程池,每个客户端的读取操作在独立的线程中执行,减少了锁竞争的可能性。
- 异常处理:在读取操作中捕获并处理IOException异常,以避免程序崩溃或出现不可预料的错误。
- 线程池配置:使用
Executors.newFixedThreadPool()方法创建指定大小的线程池,您可以根据需要进行调整。 - 内存管理:使用ByteBuffer来管理内存,通过allocate()方法分配缓冲区,通过flip()和clear()方法重置缓冲区。
请注意,这只是一个示例代码,实际应用中可能需要根据具体情况进行调整和优化。
相关文章:
Java NIO 高并发开发
Java NIO 高并发开发 前言 Java NIO(New I/O)相比于传统的Java I/O(BIO)在高并发开发方面具有以下优势: 非阻塞模式:Java NIO使用非阻塞的I/O操作,允许一个线程管理多个通道(Channe…...
8.循环神经网络
#pic_center R 1 R_1 R1 R 2 R^2 R2 目录 知识框架No.1 序列模型一、序列模型二、D2L代码注意点三、QA No.2 文本预处理一、D2L代码注意点二、QA No.3 语言模型一、语言模型二、D2L代码注意点三、QA No.4 循环神经网络 RNN一、RNN二、QA No.5 循环神经网络 RNN 的实现一、从零…...
[C++随想录] map和set的使用
map和set的使用 set初始化finderasecountlower_bound && upper_boundequal_ range mapinsert[ ]运算符 multiset && multimap set — — key模拟 map — — key_value模型 set 初始化 void set_test1() {set<int>s;s.insert(10);s.insert(12);s.insert(…...
公网IP怎么设置?公网ip有哪些优点和缺点?
随着互联网的普及,越来越多的人开始关注网络安全和隐私保护。其中,公网IP的设置成为了一个备受关注的话题。本文将详细介绍公网IP的设置方法以及公网IP的优点和缺点。 一、公网IP设置方法 1. 路由器设置 在家庭或企业网络中,路由器通常是最重…...
蓝桥杯第 2 场算法双周赛 第2题 铺地板【算法赛】c++ 数学思维
题目 铺地板https://www.lanqiao.cn/problems/5887/learning/?contest_id145 问题描述 小蓝家要装修了,小蓝爸爸买来了很多块(你可以理解为数量无限)2323 规格的地砖,小蓝家的地板是 nm 规格的,小蓝想问你…...
APScheduler-调度器 BackgroundScheduler
当你有主程序需要执行,让定时任务在后台执行时,可以用BackgroundScheduler from apscheduler.schedulers.background import BackgroundScheduler import time # 仅运行定时任务 scheduler BackgroundScheduler() # interval example, 间隔执行,…...
浅谈UI自动化测试
随着软件行业的不断发展,建立一个完善的自动化测试体系变得至关重要。目前,自动化测试主要涵盖接口自动化测试和UI自动化测试两个主要领域。就目前而言,企业在UI自动化测试方面的覆盖率仍然相对较低。 接口自动化测试可以模拟和执行应用程序…...
golang 工程组件 grpc-gateway—yaml定义http规则,和自定义实现网关路由
yaml定义http规则,和自定义实现网关路由 proto定义http规则总归是麻烦的,因为proto文件还是定义消息,grpc接口好一些。配置http规则有更好的方式。我们可以使用yaml文件定义接口的http规则。 同时有些接口不是只是让网关转发这么简单 有时需…...
在NLP中一下常见的任务,可以用作baseline;MRPC,CoLA,STS-B,RTE
1.MRPC(Microsoft Research Paraphrase Corpus)任务 是一个用于文本匹配和相似度判断的任务。在MRPC任务中,给定一对句子,模型需要判断它们是否是语义上等价的。MRPC任务的训练集和测试集由约5700对英语句子组成。每个句子对都有…...
【计算机网络笔记】Cookie技术
系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…...
在虚拟环境中,通过pip安装tensorflow
目录 激活python虚拟环境,更新pip 通过pip 安装tensorflow 确定python版本: 编辑安装tensorflow: 编辑 为什么使用pip安装tensorflow? 激活python虚拟环境,更新pip 命令为python -m pip install --upgrade pip 通过pip 安装tensorf…...
【Django restframework】django跨域问题,解决PUT/PATCH/DELETE用ajax请求无法提交数据的问题
【Django restframework】django跨域问题,解决PUT/PATCH/DELETE用ajax请求无法提交数据的问题 1 问题描述: 我用restframework(ModelSerializerGenericApiView)开发了一组符合RestFul接口标准的接口,这意味着它将支持客户端发来的GET、POST、…...
神经网络与深度学习第四章前馈神经网络习题解答
[习题4-1] 对于一个神经元 ,并使用梯度下降优化参数时,如果输入恒大于0,其收敛速度会比零均值化的输入更慢。 首先看一下CSDN的解释: 如果输入x恒大于0,使用sigmoid作为激活函数的神经元的输出值将会处于饱和状态&a…...
Go 语言操作 MongoDb
文章目录 连接数据库插入数据库插入一条数据批量插入数据 查询数据用 BSON 进行复合查询聚合查询 更新数据删除数据 连接数据库 package mainimport ("context""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options"…...
UE4/5 竖排文字文本
方法一、使用多行文本组件 新建一个Widget Blueprint 添加Text 或者 Editable Text(Multi-Line) 、TextBox(Multi-Line) 组件。 添加文字,调整字号,调整成竖排文字。 在Wrapping (换行)面板中 : 勾选 Auto Wrap te…...
centos jdk 安装
1、oracle官网下载jdk8 https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 2、楼主用的以前下载好的安装包jdk-8u111-linux-x64.gz。下载后使用工具如Xftp将安装包上传到/opt目录下,这里随便什么目录都行,并解压安装包。 c…...
【计算机网络】什么是HTTPS?HTTPS为什么是安全的?
【面试经典题】 前言: HTTP最初的设计就是用于数据的共享和传输,并没有考虑到数据的安全性,如窃听风险,篡改风险和冒充风险。HTTPS是在 HTTP 的基础上引入了一个加密层。HTTPS通过数据加密,数据完整性检验和身份认证…...
Windows-Oracle19c 安装详解-含Navicate远程连接配置 - 同时连接Oracle11g和Oracle19c
文章目录 0 说明1 下载链接2 安装:一定要以管理员身份运行,不然后面有可能会报错。3 启动监听4. 登录Oracle4 Navicate远程连接-配置监听4.1 修改监听文件4.2 网络配置助手-配置本地监听端口4.3 Navicate连接成功 5 Navicate同时连接两个Oracle数据库 0 …...
文件权限详解
一、文件类型 ll指令查看文件详细信息中,第一列就是文件类型。 常见的文件类型有: 1、 - :普通文件 (文本、源代码、图片、视频、可执行) 2、 d :目录文件 3、b :块设备 4、c ࿱…...
在声明和定义的一些小坑
1、静态成员变量的初始化 静态成员变量声明在 .h 头文件文件中,初始化应该在 .cpp 源文件中 就会出现"找到一个或多个多重定义的符号",下面的错误 class MyString{public:typedef char* iterator;typedef const char* const_iterator;iterator begin();…...
别再只测accuracy!DeepSeek集成测试必须监控的5个隐性指标(P99首token延迟、context bleed率、tool-call schema漂移)
更多请点击: https://intelliparadigm.com 第一章:DeepSeek集成测试的核心范式演进 DeepSeek大模型的工程化落地对集成测试提出了全新挑战:传统基于接口响应码与字段校验的测试范式已难以覆盖语义一致性、推理链鲁棒性、上下文敏感度等高阶质…...
基于ESP32与MQTT的家庭环境监测系统:从传感器选型到数据可视化实战
1. 项目概述与核心价值最近几年,我身边越来越多的朋友开始关注家里的空气质量、温湿度这些看不见摸不着,但又实实在在影响生活舒适度和健康的环境指标。从新装修的房子担心甲醛,到有老人小孩的家庭在意PM2.5和二氧化碳浓度,再到南…...
CSharpVerbalExpressions常见问题解答:解决开发者遇到的10个典型挑战
CSharpVerbalExpressions常见问题解答:解决开发者遇到的10个典型挑战 【免费下载链接】CSharpVerbalExpressions 项目地址: https://gitcode.com/gh_mirrors/cs/CSharpVerbalExpressions CSharpVerbalExpressions是一个强大的C#库,它通过类自然语…...
树莓派工业GPIO接口板:电气隔离与电平转换实战指南
1. 项目概述:为什么需要一块工业级GPIO接口板?如果你用树莓派做过一些硬件项目,尤其是涉及到控制继电器、电机或者连接工业设备(比如PLC、变频器)时,大概率踩过这样的坑:直接用树莓派的GPIO引脚…...
Jetson Orin上TVA模型DLA精准卸载配置
重磅预告:本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容,该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著,特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...
从《王者荣耀》野怪巡逻到RTS单位集结:拆解Unity Navigation系统在实战中的4种高级用法
从《王者荣耀》野怪巡逻到RTS单位集结:拆解Unity Navigation系统在实战中的4种高级用法在MOBA游戏中,野怪沿着固定路线巡逻时突然转向追击玩家;RTS战场上,上百个单位向同一目标点移动却能保持整齐队形;潜行游戏中&…...
【独家首发】Sora 2 AVI支持并非“开箱即用”:3层封装校验机制详解(RIFF→AVI→OpenCV Mat内存映射链路图解)
更多请点击: https://codechina.net 第一章:Sora 2 AVI支持并非“开箱即用”:核心矛盾与技术定位 Sora 2 的官方文档与发布说明中明确将 AVI 视为“实验性容器支持”,而非默认启用的输入格式。其底层解码栈基于 FFmpeg 5.1 构建&…...
D3KeyHelper终极指南:5分钟掌握暗黑3最强自动化工具
D3KeyHelper终极指南:5分钟掌握暗黑3最强自动化工具 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper D3KeyHelper是一款专为《暗黑破坏神3…...
摆脱论文困扰!2026年最值得拥有的专业AI智能降重工具
2026年论文降AI率工具已从“基础改写”升级为多维度智能优化系统,核心评价维度涵盖AI生成内容识别精度、语义逻辑一致性、学术格式合规性、查重适配能力及多语言处理水平。本次测评覆盖6款主流工具,测试场景包括中文与英文论文、全流程与专项功能、免费与…...
压测不只是加并发:我们模拟真实用户行为后,发现了隐藏瓶颈
在性能测试领域,一个根深蒂固的误解是:压测就是使劲加线程数,看系统什么时候崩。很多团队用 JMeter 起 500 个并发,照着接口列表跑一圈,看到 TPS 平稳、响应时间没超过 300ms,就觉得万事大吉。可一旦上线&a…...
