什么是Java中的非阻塞I/O,你能提供一个例子吗?

什么是Java中的非阻塞I/O,你能提供一个例子吗?

在Java中,非阻塞I/O是一种I/O模型,它允许程序在等待数据就绪时继续执行其他任务,而不必一直阻塞等待数据的到来。非阻塞I/O通常与多路复用技术(如Java NIO的Selector)结合使用,以实现在单线程或少量线程下处理多个I/O通道的能力。

下面是一个简单的Java非阻塞I/O的示例,使用Java NIO中的ServerSocketChannel和Selector:

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;public class NonBlockingServer {public static void main(String[] args) {try {// 创建ServerSocketChannel并绑定端口ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();serverSocketChannel.socket().bind(new InetSocketAddress(8080));serverSocketChannel.configureBlocking(false); // 设置为非阻塞模式// 创建Selector并注册ServerSocketChannelSelector selector = Selector.open();serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);while (true) {// 阻塞等待I/O事件发生selector.select();// 获取所有发生的事件Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();while (iterator.hasNext()) {SelectionKey key = iterator.next();iterator.remove();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()) {// 处理读取事件SocketChannel clientChannel = (SocketChannel) key.channel();ByteBuffer buffer = ByteBuffer.allocate(1024);int bytesRead = clientChannel.read(buffer);if (bytesRead == -1) {clientChannel.close();key.cancel();} else if (bytesRead > 0) {buffer.flip();byte[] data = new byte[buffer.limit()];buffer.get(data);System.out.println("Received: " + new String(data));}}}}} catch (IOException e) {e.printStackTrace();}}
}

在这个例子中,服务器使用了非阻塞I/O模型。它首先创建一个ServerSocketChannel,并将其配置为非阻塞模式。然后,它创建一个Selector并将ServerSocketChannel注册到Selector上,以便监听连接事件。

在主循环中,服务器通过调用selector.select()来阻塞等待I/O事件的发生。一旦有事件发生,服务器会遍历所有发生的事件,并根据事件类型执行相应的操作。如果有新的连接到达(Acceptable事件),服务器会接受连接,并将客户端的SocketChannel注册到Selector上以监听读取事件。如果客户端有数据可读(Readable事件),服务器会读取数据并进行处理。这样,服务器可以在等待数据到达时继续执行其他任务,而不必阻塞等待数据的到来。

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

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

相关文章

[UI5 常用控件] 09.IconTabBar,IconTabHeader,TabContainer

文章目录 前言1. IconTabBar1.1 简介1.2 基本结构1.3 用法1.3.1 颜色&#xff0c;拖放&#xff0c;溢出1.3.2 Icons Only , Inner Contents1.3.3 showAll,Count,key,IconTabSeparator 1.3.4 Only Text1.3.5 headerMode-Inline1.3.6 design,IconTabSeparator-icon1.3.7 DensityM…

【AIGC】Stable Diffusion插件安装

Stable Diffusion 的插件安装通常需要遵循以下步骤&#xff1a; 第一、查找插件&#xff0c;您需要确定您想要安装的 Stable Diffusion 插件。您可以从 Stable Diffusion 的官方网站或社区论坛上找到各种各样的插件&#xff0c;这些插件可能提供了额外的功能、模型或工具。 第…

Java 和 JavaScript 的奇妙协同:语法结构的对比与探索(下)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【英语学习】Day 01

List 01 wordtranslatesparsityn.稀少promotingv.促进、振兴&#xff0c;宣传regularizationn.n. 正规化&#xff1b;调整&#xff1b;合法化&#xff1b;Sparsity-Promoting Regularization稀疏促进正则化Multipath Error多路径误差mitigationn. 缓解&#xff1b;减轻&#x…

day52 ● 121. 买卖股票的最佳时机 ● 122.买卖股票的最佳时机II

121. 买卖股票的最佳时机 122.买卖股票的最佳时机II

Go语言的100个错误使用场景(40-47)|字符串函数方法

前言 大家好&#xff0c;这里是白泽。 《Go语言的100个错误以及如何避免》 是最近朋友推荐我阅读的书籍&#xff0c;我初步浏览之后&#xff0c;大为惊喜。就像这书中第一章的标题说到的&#xff1a;“Go: Simple to learn but hard to master”&#xff0c;整本书通过分析100…

《Java 简易速速上手小册》第3章:Java 数据结构(2024 最新版)

文章目录 3.1 数组和字符串 - 数据的基本营地3.1.1 基础知识3.1.2 重点案例&#xff1a;统计文本中的单词频率3.1.3 拓展案例 1&#xff1a;寻找数组中的最大元素3.1.4 拓展案例 2&#xff1a;反转字符串 3.2 集合框架概述 - 数据小队的训练场3.2.1 基础知识3.2.2 重点案例&…

Intelij Terminal中文乱码解决

第一&#xff1a; &#xff08;重启Intelij生效&#xff09; -Dfile.encodingUTF-8 第二&#xff1a; &#xff08;重启Intelij生效&#xff09; 如果还不行&#xff0c;第三&#xff1a; 测试结果很ok&#xff1a;

5.10 BCC工具之stacksnoop简介

一,stacksnoop简介 stacksnoop用于跟踪内核函数,并打印出所有的内核栈。 二,代码示例 #!/usr/bin/python# USAGE: stacksnoop [-h] [-p PID] [-s] [-v] functionfrom __future__ import print_function from bcc import BPF import argparse import time# 参数 examples …

w28pikachu-csrf实例

pikachu-csrf实例 get级别 这里需要同时修改性别、手机、住址、邮箱。 写一个简单的html文件&#xff0c;里面伪装修改密码的文字&#xff0c;代码如下&#xff1a; <html><body><a href"http://pikachu:7002/vul/csrf/csrfget/csrf_get_edit.php?sex…

驾驭C语言的内联艺术:详尽探讨`inline`关键字及其在内联函数背后的深邃逻辑与实战精要

导语 在C语言的广阔天地中&#xff0c;内联函数&#xff08;Inline Function&#xff09;犹如一把双刃剑&#xff0c;既是编译期优化的重要手段&#xff0c;又是一门需要审慎把握的技术策略。通过在函数定义前冠以inline关键字&#xff0c;编译器便有机会将传统的函数调用替换…

java中鼠标点击事件三种书写方式

1.首先创建一个按钮,使用按钮中的方法创建一个鼠标点击事件 JButton jtbnew JButton("点我啊"); jtb.setBounds(0,0,100,50); //添加鼠标点击事件 jtb.addActionListener() 第一种方法 addActionListener是一个interface,所以我们要写一个implements,第一种方法,单…

论文阅读_用模型模拟记忆过程

英文名称: A generative model of memory construction and consolidation 中文名称: 记忆构建和巩固的生成模型 文章: https://www.nature.com/articles/s41562-023-01799-z 代码: https://github.com/ellie-as/generative-memory 作者: Eleanor Spens, Neil Burgess&#xff…

智慧供应链控制塔大数据解决方案

一、供应链控制塔的概念定义 (1) Gartner 的定义: “控制塔是一个物理或虚拟仪表板,提供准确的、及时的、完整的物流事件和数据,从组织和服务的内部和跨组织运作供应链,以协调所有相关活动。”、“供应链控制塔…提供供应链端到端整体可见性和近实时信息和决策的概念……

深入解析Mybatis-Plus框架:简化Java持久层开发(二)

&#x1f340; 前言 博客地址&#xff1a; CSDN&#xff1a;https://blog.csdn.net/powerbiubiu &#x1f44b; 简介 本章节开始从实际的应用场景&#xff0c;来讲解Mybatis-Plus常用的一些操作&#xff0c;根据业务场景来进行增删改查的功能&#xff0c;首先先搭建一个项目…

内容检索(2024.02.17)

随着创作数量的增加&#xff0c;博客文章所涉及的内容越来越庞杂&#xff0c;为了更为方便地阅读&#xff0c;后续更新发布的文章将陆续在此汇总并附上原文链接&#xff0c;感兴趣的小伙伴们可持续关注文章发布动态&#xff01; 本期更新内容&#xff1a; 1. 信号完整性理论与…

印度基金低风险套利回顾

2024年1月19日当天&#xff0c;印度基金(164824)开放申购&#xff0c;限额申购100元&#xff0c;当天溢价率13%左右&#xff0c;这个溢价率已经非常可观了&#xff0c;当然要祭出一拖七大法搞它一把&#xff01; 一拖七套利原理简介 详细的原理和方法可自行在雪球搜索&#…

ACM题解Day4 | Boring Non-Palindrome ,Mental Rotation ,so Easy

学习目标&#xff1a; 博主介绍: 27dCnc 专题 : 数据结构帮助小白快速入门算法 &#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d; ☆*: .&#xff61;. o(≧▽…

时间序列预测模型:ARIMA模型

1. ARIMA模型原理介绍 ARIMA模型&#xff0c;全称为自回归积分滑动平均模型&#xff08;Autoregressive Integrated Moving Average Model&#xff09;&#xff0c;是一种常用的时间序列预测方法。ARIMA模型通过对时间序列数据的差分化处理&#xff0c;使非平稳时间序列数据变…

详解FreeRTOS:如何统计任务运行时间和CPU占有率(拓展篇—7)

FreeRTOS 可以通过函数 vTaskGetRunTimeStats()来统计每个任务使用 CPU 的时间,以及所使用的时间占总时间的比例。在调试代码的时候我们可以根据这个时间使用值来分析哪个任务的 CPU 占用率高,然后合理的分配或优化任务。 本篇博文我们就来学习如何使用 FreeRTOS 运行时间状态…