Java NIO Selector实战指南(多路复用技术大揭秘)

第一章:Java NIO Selector多路复用技术概述

Java NIO(New I/O)是JDK 1.4引入的非阻塞I/O机制,其核心组件之一——Selector,实现了I/O多路复用,极大提升了高并发场景下的系统性能。Selector允许单个线程监控多个通道(Channel)的I/O事件,如连接、读、写等,避免了为每个连接创建独立线程所带来的资源开销。

Selector的工作机制

Selector通过操作系统底层的多路复用机制(如Linux的epoll、BSD的kqueue)实现高效的事件监听。它能够注册多个SelectableChannel,并统一检测这些通道上是否有就绪的I/O操作。当某个通道准备就绪时,Selector会通知应用程序进行相应处理。
  • 创建Selector实例:调用Selector.open()获取选择器对象
  • 注册通道:将SocketChannel或ServerSocketChannel注册到Selector,并指定监听事件
  • 轮询就绪事件:通过select()方法阻塞等待就绪事件
  • 处理就绪通道:从SelectedKeys集合中获取就绪的SelectionKey并执行对应逻辑

关键代码示例

// 打开Selector
Selector selector = Selector.open();

// 假设已有一个非阻塞的ServerSocketChannel
serverChannel.configureBlocking(false);
serverChannel.register(selector, SelectionKey.OP_ACCEPT);

// 轮询监听事件
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()) {
            // 处理新连接
        } else if (key.isReadable()) {
            // 处理读操作
        }
        keyIterator.remove(); // 必须手动移除
    }
}

Selector的优势与适用场景

特性说明
单线程管理多通道减少线程上下文切换开销
非阻塞I/O提高吞吐量,适合高并发网络服务
事件驱动模型仅在I/O就绪时触发处理,资源利用率高

第二章:Selector核心机制与工作原理

2.1 多路复用技术的本质与演进历程

多路复用技术的核心在于通过共享单一物理通道传输多个独立数据流,提升资源利用率。其本质是时间、频率或空间维度上的信道划分与调度。
从频分到时分:早期复用方式
早期模拟通信采用频分多路复用(FDM),将频谱划分为子频带。随后时分多路复用(TDM)通过周期性分配时隙实现数字信号复用,广泛应用于电话网络。
现代I/O多路复用机制
在操作系统层面,select、poll 和 epoll 实现了高效的事件驱动模型。以epoll为例:

int epfd = epoll_create(1024);
struct epoll_event ev, events[64];
ev.events = EPOLLIN;
ev.data.fd = sockfd;
epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &ev);
int n = epoll_wait(epfd, events, 64, -1); // 阻塞等待事件
上述代码创建 epoll 实例并监听套接字读事件。epoll_wait 可高效检测就绪连接,避免轮询开销,支撑高并发服务器设计。
  • FDM:按频率划分信道
  • TDM:按时隙轮流使用
  • epoll:基于事件通知的I/O复用

2.2 Selector、Channel与SelectionKey关系解析

在Java NIO中,Selector、Channel和SelectionKey三者协同工作,实现高效的多路复用I/O操作。
核心组件职责
  • Channel:表示一个可读写的连接通道,如SocketChannel或ServerSocketChannel;
  • Selector:监听多个Channel的事件(如OP_READ、OP_WRITE);
  • SelectionKey:绑定Channel与Selector的注册关系,并存储就绪事件信息。
注册与事件关联
SocketChannel channel = SocketChannel.open();
channel.configureBlocking(false);
Selector selector = Selector.open();
SelectionKey key = channel.register(selector, SelectionKey.OP_READ);
上述代码中,register() 方法将Channel注册到Selector,返回的SelectionKey保存了通道的可读事件标记。当Selector检测到该通道有数据可读时,可通过selectedKeys()获取对应的Key进行处理。
关系映射表
组件作用依赖关系
Channel数据传输载体必须注册到Selector
Selector事件轮询中枢管理多个SelectionKey
SelectionKey状态与事件记录关联唯一Channel与Selector

2.3 操作系统层面的I/O多路复用支持(select/poll/epoll)

在高并发网络编程中,I/O多路复用是提升性能的核心机制。操作系统提供了多种实现方式,其中以 `select`、`poll` 和 `epoll` 最为典型。
select 与 poll 的基本模型
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
`select` 通过位图管理文件描述符集合,每次调用需传递全部监控的fd集合,存在描述符数量限制(通常1024),且时间复杂度为 O(n)。 `poll` 改进为使用链表结构,突破了数量限制,但同样需要遍历所有fd,效率未本质提升。
epoll 的高效机制
epoll 采用事件驱动机制,包含三个核心接口:
  • epoll_create:创建 epoll 实例;
  • epoll_ctl:注册或修改 fd 事件;
  • epoll_wait:等待就绪事件,仅返回活跃fd。
其内核使用红黑树管理fd,就绪事件通过回调机制加入就绪链表,避免轮询,时间复杂度接近 O(1),适用于大规模连接场景。

2.4 Selector的创建与注册流程详解

在NIO编程中,Selector是实现多路复用的核心组件。其创建通过调用`Selector.open()`方法完成,底层由JVM根据操作系统类型选择合适的SelectorProvider实例化。
Selector的创建过程
Selector selector = Selector.open();
该方法内部通过`SelectorProvider.provider().openSelector()`获取系统默认的Provider,并初始化对应的SelectorImpl对象,完成系统资源的绑定。
通道注册流程
通道必须配置为非阻塞模式后才能注册到Selector:
  • 调用channel.configureBlocking(false)
  • 执行channel.register(selector, SelectionKey.OP_READ)
注册后,Selector会生成一个SelectionKey用于跟踪该通道的状态。
关键结构关系
组件作用
Selector监听多个通道事件
SelectionKey维护通道与事件的绑定关系
SelectorProvider提供底层实现工厂

2.5 就绪事件检测与选择器阻塞策略分析

在I/O多路复用机制中,就绪事件的准确检测是提升系统并发能力的关键。Selector通过内核提供的事件通知机制(如epoll、kqueue)监听多个通道的就绪状态。
事件检测流程
Selector轮询注册的Channel,检测其是否已准备好读、写或异常处理。当文件描述符状态变更时,内核将其加入就绪队列。
阻塞策略类型
  • select():固定时间阻塞,需遍历所有fd
  • poll():无限阻塞,直到有事件到达
  • epoll_wait():支持超时控制,仅返回就绪fd

// 阻塞等待至少一个通道就绪
int readyCount = selector.select(5000); // 最长阻塞5秒
Set<SelectionKey> selectedKeys = selector.selectedKeys();
上述代码调用select(5000)使线程最多阻塞5秒,期间若有通道就绪则立即唤醒,减少空转开销,平衡响应性与CPU利用率。

第三章:基于Selector的非阻塞网络编程实践

3.1 构建非阻塞服务器的基本结构

构建高性能网络服务的核心在于避免线程因 I/O 操作而阻塞。非阻塞服务器通过事件驱动机制,实现单线程处理多个连接。
事件循环与文件描述符监控
使用 epoll(Linux)或 kqueue(BSD)等系统调用监控大量套接字的状态变化,仅在数据就绪时触发处理逻辑。
// 示例:Go 中的非阻塞监听
listener, _ := net.Listen("tcp", ":8080")
listener.(*net.TCPListener).SetNonblock(true)

for {
    conn, err := listener.Accept()
    if err != nil {
        continue // 无连接时立即返回,不阻塞
    }
    go handleConnection(conn) // 启动协程处理
}
上述代码中,SetNonblock(true) 设置监听套接字为非阻塞模式,Accept() 在无新连接时返回错误而非挂起,配合循环实现持续轮询。
核心组件对比
组件作用
事件循环持续检测 I/O 状态
非阻塞 I/O确保读写不挂起线程
回调机制数据就绪后触发处理函数

3.2 客户端连接接入与通道管理

在高并发通信场景下,客户端连接的接入与通道管理是系统稳定性的核心环节。服务端需高效处理海量TCP长连接,并为每个连接分配唯一通道标识。
连接接入流程
客户端发起连接后,服务端通过Netty的ServerBootstrap绑定事件处理器,完成Channel注册与初始化:

serverBootstrap.group(bossGroup, workerGroup)
    .channel(NioServerSocketChannel.class)
    .childHandler(new ChannelInitializer<SocketChannel>() {
        protected void initChannel(SocketChannel ch) {
            ch.pipeline().addLast(new MessageDecoder());
            ch.pipeline().addLast(new MessageEncoder());
            ch.pipeline().addLast(new ClientHandler());
        }
    });
上述代码中,bossgroup负责监听接入请求,workergroup处理I/O读写;ChannelInitializer用于配置管道中的处理器链。
通道生命周期管理
使用ChannelGroup统一管理所有活跃通道,支持广播与精准推送:
  • 连接建立时加入分组
  • 异常断开时自动清理资源
  • 支持按用户ID或设备ID索引通道

3.3 网络数据读写操作的高效处理

在高并发网络编程中,高效的数据读写是系统性能的关键瓶颈。传统阻塞I/O在连接数增加时会显著消耗系统资源,因此现代服务普遍采用非阻塞I/O结合事件驱动机制。
使用 epoll 提升 I/O 多路复用效率
Linux 下的 epoll 能够高效管理大量套接字事件。以下为基于 Go 的简化示例:

// 启用非阻塞读取
conn.SetReadDeadline(time.Time{}) // 无超时
n, err := conn.Read(buffer)
if err != nil {
    if netErr, ok := err.(net.Error); ok && netErr.Timeout() {
        continue // 超时则跳过,不关闭连接
    }
}
该代码通过取消读取截止时间,配合事件通知机制,实现非阻塞轮询。参数 time.Time{} 表示不设超时,确保仅在有数据到达时返回。
零拷贝技术减少内存开销
使用 sendfile 或 splice 可避免用户态与内核态间的数据复制。典型场景如下表所示:
技术适用场景性能增益
epoll高并发连接提升 I/O 并发能力
splice大文件传输减少 CPU 拷贝次数

第四章:高并发场景下的优化与实战技巧

4.1 SelectionKey的合理使用与事件分离

在NIO编程中,SelectionKey 是连接 Channel 与 Selector 的核心纽带。合理使用其事件分离机制可显著提升系统响应效率。
事件类型与位掩码
SelectionKey 支持四种事件类型:
  • OP_READ:可读事件
  • OP_WRITE:可写事件
  • OP_CONNECT:连接建立
  • OP_ACCEPT:可接受新连接
事件分离示例
if ((key.readyOps() & SelectionKey.OP_READ) != 0) {
    // 处理读操作
    SocketChannel channel = (SocketChannel) key.channel();
    channel.read(buffer);
}
if ((key.readyOps() & SelectionKey.OP_WRITE) != 0) {
    // 处理写操作,避免持续触发
    channel.write(buffer);
    key.interestOps(key.interestOps() & ~SelectionKey.OP_WRITE); // 关闭写事件监听
}
上述代码通过位运算判断就绪事件,并在写操作完成后关闭 OP_WRITE 监听,防止空转消耗CPU资源。

4.2 避免空轮询与CPU资源浪费的解决方案

在高频率轮询场景中,线程持续检查资源状态会导致CPU占用率过高。采用事件驱动机制替代主动轮询,可显著降低系统开销。
使用条件变量优化等待机制

std::mutex mtx;
std::condition_variable cv;
bool data_ready = false;

void worker() {
    std::unique_lock lock(mtx);
    cv.wait(lock, []{ return data_ready; }); // 阻塞直至通知
    // 执行后续处理
}
该代码通过condition_variable实现线程阻塞等待,避免了忙等待。当data_ready为假时,线程挂起并释放CPU资源,仅在被唤醒后重新检查条件。
异步通知模型对比
  • 轮询:每1ms检查一次,CPU占用可达20%
  • 事件驱动:无活动时不消耗CPU
  • 混合模式:定时+事件触发,平衡延迟与性能

4.3 多线程结合Selector提升处理能力

在高并发网络编程中,单一线程处理多个客户端连接容易成为性能瓶颈。通过将多线程模型与 I/O 多路复用(如 Java NIO 中的 Selector)结合,可显著提升服务端的并发处理能力。
核心架构设计
采用“主线程负责接收连接,工作线程池处理读写”的分工模式。主线程注册 OP_ACCEPT 事件,一旦有新连接接入,将其分发给空闲的工作线程,该线程绑定自己的 Selector 监听后续读写事件。

Selector selector = Selector.open();
socketChannel.configureBlocking(false);
socketChannel.register(selector, SelectionKey.OP_READ);
上述代码片段展示了通道注册到选择器的过程。非阻塞模式是使用 Selector 的前提,OP_READ 表示监听读就绪事件。
性能优势对比
  • 避免了传统阻塞 I/O 中每个连接占用一个线程的资源消耗
  • Selector 能高效轮询上千个通道的状态变化
  • 线程间职责分离,提高了 CPU 缓存命中率和调度效率

4.4 实现可扩展的Reactor模式架构

在高并发服务设计中,Reactor模式通过事件驱动机制提升系统吞吐量。核心思想是将I/O事件的监听与处理分离,由一个中央分发器(Reactor)管理所有事件源,并将其分发给对应的处理器。
核心组件结构
  • Reactor:负责监听文件描述符上的事件,如读就绪、写就绪
  • Acceptor:处理新连接建立,注册到Reactor中
  • Handler:具体事件的业务逻辑处理单元
代码实现示例
type Reactor struct {
    events map[int]EventHandler
}

func (r *Reactor) Register(fd int, handler EventHandler) {
    r.events[fd] = handler
}

func (r *Reactor) Dispatch() {
    for {
        activeEvents := Poller.Wait()
        for _, event := range activeEvents {
            r.events[event.Fd].Handle(event.Type)
        }
    }
}
上述Go语言伪代码展示了Reactor的核心调度逻辑。Register方法用于注册文件描述符及其对应处理器,Dispatch循环等待事件并分发处理。Poller为底层I/O多路复用接口封装,如epoll或kqueue。 通过引入线程池和多Reactor实例,可进一步实现主从Reactor模式,提升横向扩展能力。

第五章:总结与未来技术展望

边缘计算与AI融合的实践路径
在智能制造场景中,边缘设备正逐步集成轻量级AI模型。以工业质检为例,通过在产线部署搭载TensorFlow Lite的嵌入式网关,实现实时缺陷检测:

# 在边缘设备加载量化后的模型
interpreter = tf.lite.Interpreter(model_path="quantized_model.tflite")
interpreter.allocate_tensors()

# 获取输入输出张量
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()

# 推理执行
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
detection_result = interpreter.get_tensor(output_details[0]['index'])
云原生架构的演进趋势
Kubernetes生态持续扩展,服务网格与无服务器架构深度整合。以下为典型微服务治理方案对比:
方案延迟开销运维复杂度适用场景
Istio15-25ms高金融级多租户系统
Linkerd8-12ms中SaaS平台服务治理
Knative动态伸缩高事件驱动型Serverless
量子安全加密的落地挑战
随着NIST后量子密码标准推进,企业需提前规划密钥体系迁移。建议实施步骤:
  • 评估现有PKI体系中的长期敏感数据
  • 在测试环境部署CRYSTALS-Kyber密钥封装模块
  • 建立混合加密过渡机制,兼容传统RSA算法
  • 定期审计硬件安全模块(HSM)的抗量子能力
JavaIO四大模型:NIO(IO多路复用) 文章目录概述NIO涉及到的名词JavaNIO 服务端和客户端流程 概述         Java中的 Selector 和 Linux中的 epoll 都是基友IO多路复用的,有时也被称为异步阻塞IO。         我们之前介绍过,同步阻塞I/O和同步非阻塞IO。对于同步阻塞I/O来说,每次进行I/O时,我们的用户线程都会阻塞,显然这在高并发下效 阅读详情

相关推荐

NIO解读之多路复用器Selector

Selector类的结构图如下所示: Selector是JDK的NIO中最重要的类之一,当我们通过Selector.open()方法打开一个多路复用器的时候实际上执行的open方法为 public static Selector open() throws IOException {     return SelectorProvider.provider().openSel

yzq234040228的专栏 6190

JavaNIOAPI源码揭秘:Selector多路复用与非阻塞IO的核心逻辑

Spring 框架资源加载器 ClassPathResource 与 FileSystemResource

2501_93727995的博客 318

网络-Java中NIO详解(Buffer/Selector/Channel三大组件原理)

NIO(non-blocking IO)概述: BIO为jdk1.4及以上版本里提供的新api ,为所有原始类型(boolean除外) 提供缓存支持的容器。 NIO服务器实现模式为所有请求一个线程,即客户端发送的连接请求都会被注册到多路复用器上,多路复用器轮询到连接有IO请求时才启动一个线程进行处理。 这句话有问题 NIO主要想解决的是BIO的大并发问题: 在使用同步IO的网络应用中,如果要同...

Fly_Fly_Zhang的博客 2671

Java中IO多路复用技术详解

Java中的IO多路复用是实现高性能、高并发服务器的核心技术之一。本文全面深入剖析Java中IO多路复用的底层原理、NIO核心组件(Channel、Buffer、Selector)、非阻塞编程模型、以及实际案例中的应用场景,辅以丰富的示例代码讲解每个知识点,帮助读者彻底掌握Java NIO体系与实战能力。

持续输出Java相关知识 2872

SAP PCC成本收集器实战:从配置到结算的完整流程解析

本文详细解析了SAP PCC成本收集器从配置到结算的完整流程,特别适用于重复制造行业。通过实战案例和配置要点,帮助用户掌握物料分类账管理、成本中心费用归集及差异分析等核心功能,提升企业生产成本控制效率。

weixin_29251567的博客 896

解决Android UVCCamera stopPreview 报错 崩溃 闪退 问题

在使用libuvccamera库的UVCCamera时,经常在调用stopPreview关闭预览的时候,app直接崩溃闪退了,经过综合各种修改源码的方案,已解决这个问题,以下请参考: 首先找到android_usbfs.c,linux_usbfs.c两个原文件,在两个文件中都可以找到这段代码,按如下示例修改: 修改前: for (i = 0; i < num_urbs; i++) { if (urb == tpriv->iso_urbs[i]) { urb_idx = i + 1;

hanye2020的博客 3576

【编程进阶知识】Java NIO:掌握高效的I/O多路复用技术

Java NIO提供了非阻塞的I/O操作,这对于处理高并发的网络应用至关重要。它隐藏了操作系统级别的细节,使得开发者可以更加专注于业务逻辑的实现。通过本文,你已经了解了Java NIO中的Selector如何实现高效的I/O多路复用。使用Selector,你可以构建高性能的网络应用,同时处理多个客户端连接。与传统的select/epoll相比,Java NIO提供了更加高级和面向对象的解决方案。

Dylaniou的博客 1319

强化学习新手上路:用PPO-Clip轻松玩转Pendulum-v1(PyTorch保姆级教程)

本文提供了一份基于PyTorch的PPO-Clip算法实战教程,指导强化学习新手在Pendulum-v1环境中构建连续控制智能体。教程详细解析了PPO-Clip的核心机制,特别是其Clip机制如何限制策略更新幅度以确保训练稳定,并涵盖了从环境配置、策略网络设计、经验收集到完整训练框架搭建的全过程,是掌握连续动作空间强化学习的实用指南。

weixin_29062963的博客 271

Java NIO编程实例之三Selector

Java NIO主要包含三个概念,即缓冲区(Buffer)、通道(Channel)和选择器(Selector)。前面的文章已经介绍了缓冲区和通道,本文则讲述最复杂的选择器Selector。 本文是本系列的第三篇文章,关于缓冲区Buffer可以看第一篇: https://zhuanlan.zhihu.com/p/25701512 关于通道Channel可以看第二篇: https://zhuan

LogicTeamLeader的专栏 2594

5分钟上手,Cursor + IntelliJ IDEA 双端开发:高效协同的终极方案

最好的工具,是让你忘记工具的存在。通过AI 的创造力(Cursor)IDE 的工程力(IDEA)无缝的上下文流转(插件协同)从此,不再手忙脚乱切窗口,不再迷失在文件树中。只需一个快捷键,专注编码本身。装上这两个插件后,日常开发体验虽然没有天翻地覆的变化, 但至少摸鱼的几个小时时间是有的!

weixin_44058951的博客 2198

Orcad原理图导入Allegro

在即将设计的PCB中,将层叠设置好后,执行File→import→parameters,将刚才导出的.prm文件导入,很多参数就自动设置好了,与已完成的PCB里的参数保持一致。具体操作是:在已完成的PCB里执行File→Exoprt→Parameters,弹出下图所示的对话框,选择需要导出的设计参数后,设置到导出路径,导出记录设计参数的文件(.prm)。在.brd文件导入网表后,往往需要页面大小、格点、各层叠里各要素显示颜色等参数,手动设置十分麻烦,我们可以在一块已经完成的PCB里导出记录设计参数的文件。

sinat_27007097的博客 2085

【Java NIO】— 详解 Selector

在前一篇文章中码哥分析了 ServerSocketChannel 两种模式的缺点阻塞模式:所有阻塞方法都会引起线程的暂停,根本无法应用到业务中来非阻塞模式:CPU 一直在空转,浪费资源所以,如果是我们服务端单独使用 ServerSocketChannel 确实是很麻烦,典型的吃力不讨好。故而我们希望有一个组件能够统一管理我们的 Channel,这个组件就是选择器 Selector。

smart_an的专栏 1194

别只盯着Spectre!Cadence Virtuoso里APS和Spectre X该怎么选?一份给模拟IC新手的指南

本文深入解析Cadence Virtuoso中的三大仿真引擎Spectre、APS和Spectre X,帮助模拟IC新手根据电路规模、精度需求和计算资源做出智能选择。通过对比技术指标和应用场景,提供射频电路、混合信号系统和电源管理IC的优化仿真策略,显著提升设计效率。

weixin_26841743的博客 707

Java NIO - IO多路复用详解

本文主要对IO多路复用,Ractor模型以及Java NIO对其的支持。

埃泽漫笔 1529

Open3D 点云DBSCAN聚类算法

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,能够识别任意形状的聚类,并处理噪声数据。

纵马踏花向自由 1833

原理和代码解读:用Diffusion Models高清图像修复(Image Inpainting)

在最近的Diffusion Models应用中,Image Inpainting+ControlNet/Lora等工作在模特衣服生成、家居场景重建等场景中得到了广泛的应用。这篇博客主要介绍Diffusion Models如何在修复高清图像的。

沉迷单车的追风少年 2497

Java NIO类库Selector机制解析(上)

 Java NIO类库Selector机制解析(上) 赵锟   陈皓http://blog.youkuaiyun.com/haoel 一、  前言 自从J2SE 1.4版本以来,JDK发布了全新的I/O类库,简称NIO,其不但引入了全新的高效的I/O机制,同时,也引入了多路复用的异步模式。NIO的包中主要包含了这样几种抽象数据类型:  Buffer:包含数据且

陈皓专栏 【空谷幽兰,心如皓月】 8万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java 入门指南:Java NIO —— Selector(选择器)

Selector 是 Java NIO(New I/O)库中的一个重要组件,它用于实现非阻塞 I/O 操作。它可以用于管理多个通道(如网络套接字或文件通道)的事件,从而使单个线程能够有效地处理多个通道的 I/O 操作。

热带鱼的技术博客 2863

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

BIO/NIO/多路复用/Selector/select/poll/epoll

前言 进行总结的初衷是没搞明白linux下的select/poll/epoll与java下nio的selector多路复用器的关系,于是对知识点进行了梳理。 先上结论,selector多路复用器算是对linux下的select/poll/epoll进行封装,selector可以i有多种实现,linux系统下默认使用epoll的实现方式。 BIO模型 https://www.jianshu.com/p/138847d5cafd BIO即为阻塞IO的意思,通常我们讲BIO的时候都会和服务器模型配合着讲,在实际应

Apollo的博客 2242

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

打牢Netty基础,一文带你彻底搞懂Java的Nio多路复用!

Java的NIO多路复用是一个重要的概念也是学习Netty的基础。NIO多路复用允许单个线程管理多个连接(Socket通道),通过选择器(Selector)同时监控多个通道的状态,从而实现高效的网络通信。

greatming666的博客 3817

Java NIO之多路复用器(Selector)

多路复用器Selector是Java NIO编程的基础,熟练地掌握Selector对于掌握NIO编程至关重要。多路复用器提供选择已经就绪的任务的能力。简单来讲,Selector会不断地轮询注册在其上的Channel,如果某个Channel上面有新的TCP连接接入、读和写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以获取就绪Channel的...

duanduan_l的博客 2842

Java NIO之Selector多路复用器

之前总结过NIO组件之一 Channel,我们可以通过它来与客户端建立连接,并且设置为非阻塞模式,这样虽然解决了使用BIO可能内存爆掉的问题,但是当客户端只是建立连接,没有数据收发时,如果去轮询每个客户端,可能会造成性能的浪费,这样的客户端占用越多,很有可能导致服务端cpu会飙升。Seletor多路复用由此出现。...

qq_41939120的博客 1391

《NIO 是怎么做到高性能的?从 Selector 到 Channel 的全链路剖析》

首先,NIO是"New I/O"的缩写,是Java 1.4引入的一套新的IO API。它和传统的IO(就是我们常说的BIO,Blocking I/O)最大的区别就是——不阻塞!🚫⏳传统IO(BIO):就像你去银行柜台办业务,必须排队等柜员处理完前一个人才能轮到你,期间你啥也干不了(阻塞)NIO:就像银行的取号系统,你取个号就可以去干别的事,等叫到你的号时再去处理(非阻塞)是不是感觉NIO聪明多了?

龚小帅的博客 790

JavaJDK源码中的IO与NIO:从BIO到Selector的多路复用技术演进

Spring Boot 自动配置源码 EnableAutoConfiguration 导入流程

2501_93831747的博客 856

Java NIO Selector选择器简介

Selector是Java NIO(New I/O)中的核心组件之一,用于检查一个或多个NIO Channel(通道)的状态是否处于可读、可写、可连接或可接收等。通过Selector,可以实现单线程管理多个Channel对应的网络连接,从而避免多线程的线程上下文切换带来的额外开销。Selector与Channel之间的关系是通过注册的方式完成的。只有SelectableChannel才能被Selector管理,例如所有的Socket通道。

老码农的博客 1573
上一篇: 从零构建可观测性体系:Spring Cloud Sleuth与日志集成的黄金法则
下一篇: C++ STL map插入操作深度剖析(emplace vs insert性能实测90%人不知道)
LiteCompile
博客等级 码龄1年 158粉丝 2022原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值