7.阻塞模式与非阻塞模式
1.阻塞模式
一个线程来处理多个连接显得力不从心
accept等待连接 是一个阻塞方法
read读取SocketChannel中的数据 是一个阻塞方法
/*** 服务端* @param args* @throws IOException*/public static void main(String[] args) throws IOException {//建立一个缓冲区ByteBuffer byteBuffer = ByteBuffer.allocateDirect(16);//创建一个服务器ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();//给服务器绑定一个端口8000,让客户端来连接serverSocketChannel.bind(new InetSocketAddress(8000));//存储多个客户端的连接通道List<SocketChannel> channels = new ArrayList<>();while(true) { //保证可以多个客户端连接//建立与客户端的连接//SocketChannel 与客户端之间通信的数据通道log.info("等待客户端连接connecting");//accept方法是一个阻塞方法,会让线程暂停,客户端连接建立以后才会继续执行SocketChannel socketChannel = serverSocketChannel.accept();log.info("已连接connected...{}", socketChannel);channels.add(socketChannel);for (SocketChannel sc: channels ) {//接受客户端发送的数据log.info("等待客户端向SocketChannel中传输数据...{}", sc);//read方法是一个阻塞方法,会让线程暂停sc.read(byteBuffer);byteBuffer.flip();//读模式String byteBufferContent = StandardCharsets.UTF_8.decode(byteBuffer).toString();log.info("byteBufferContent={}", byteBufferContent);byteBuffer.clear();//写模式,从0开始log.info("读完毕..{}", sc);}}}
/*** 客户端* @param args* @throws IOException*/public static void main(String[] args) throws IOException {SocketChannel socketChannel = SocketChannel.open();//连接服务端,地址localhost:8000socketChannel.connect(new InetSocketAddress("localhost", 8000));//将hello字符串->byte[]->ByteBuffer->socketChannelsocketChannel.write(StandardCharsets.UTF_8.encode("hello"));System.out.println("waiting...");}
2.非阻塞模式
/*** 服务端* @param args* @throws IOException*/public static void main(String[] args) throws IOException {//建立一个缓冲区ByteBuffer byteBuffer = ByteBuffer.allocateDirect(16);//创建一个服务器ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();//****ServerSocketChannel配置为非阻塞-默认是阻塞true,可以让accept方法变成非阻塞serverSocketChannel.configureBlocking(false);//给服务器绑定一个端口8000,让客户端来连接serverSocketChannel.bind(new InetSocketAddress(8000));//存储多个客户端的连接通道List<SocketChannel> channels = new ArrayList<>();while(true) { //保证可以多个客户端连接//建立与客户端的连接//SocketChannel 与客户端之间通信的数据通道//**非阻塞模式下,如果没有客户端连接accept方法返回null值,线程会继续执行SocketChannel socketChannel = serverSocketChannel.accept();if(null != socketChannel) {log.info("已连接connected...{}", socketChannel);channels.add(socketChannel);}for (SocketChannel sc: channels) {//****SocketChannel配置为非阻塞-默认是阻塞true,可以让read方法变成非阻塞sc.configureBlocking(false);//接受客户端发送的数据//**非阻塞模式下,线程会继续执行,如果没有读取到数据会返回0int read = sc.read(byteBuffer);if(read > 0) {byteBuffer.flip();//读模式String byteBufferContent = StandardCharsets.UTF_8.decode(byteBuffer).toString();log.info("byteBufferContent={}", byteBufferContent);byteBuffer.clear();//写模式,从0开始log.info("读完毕..{}", sc);}}}}
问题:非阻塞模式,会让线程一直在跑,太忙了,不能这么用。参考后续的Selector用法。
相关文章:
7.阻塞模式与非阻塞模式
1.阻塞模式 一个线程来处理多个连接显得力不从心 accept等待连接 是一个阻塞方法 read读取SocketChannel中的数据 是一个阻塞方法 /*** 服务端* param args* throws IOException*/public static void main(String[] args) throws IOException {//建立一个缓冲区ByteBuffer b…...

Unity类银河恶魔城学习记录11-10 p112 Items drop源代码
Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili ItemObject_Trigger.cs using System.Collections; using System.Collecti…...

EasyExcel 模板导出excel、合并单元格及单元格样式设置。 Freemarker导出word 合并单元格
xls文件: 后端代码: InputStream filePath this.getClass().getClassLoader().getResourceAsStream(templateFile);// 根据模板文件生成目标文件ExcelWriter excelWriter EasyExcel.write(orgInfo.getFilename()).excelType(ExcelTypeEnum.XLS).withTe…...

炫我科技:云渲染领域的佼佼者
随着数字化时代的来临,云渲染技术正逐渐成为影视、游戏、动画等创意产业的重要支柱。在这一领域中,炫我科技凭借其卓越的技术实力、优质的服务以及不断创新的精神,已然成为了云渲染行业的佼佼者。 炫我科技自成立之初,便以打造高…...

VsCode正确解决vue3+Eslint+prettier+Vetur的配置冲突
手把手教你VsCode正确解决vue3EslintprettierVetur的配置冲突 VsCode正确解决vue3EslintprettierVetur的配置冲突Eslint文档查看和修改规则:step1:首先快速浏览下规则简要setp2: ctrlF 搜索你要配置规则的英文名,例如attributesetp3: 修改配置…...

计算机网络—VLAN 间路由配置
目录 1.拓扑图 2.实验环境准备 3.为 R3 配置 IP 地址 4.创建 VLAN 5.配置 R2 上的子接口实现 VLAN 间路由 6.配置文件 1.拓扑图 2.实验环境准备 配置R1、R3和S1的设备名称,并按照拓扑图配置R1的G0/0/1接口的IP地址。 [Huawei]sysname R1 [R1]interface Giga…...
微服务篇-C 深入理解第一代微服务(SpringCloud)_VII 深入理解Swagger接口文档可视化管理工具
原创作者:田超凡(程序员田宝宝) 版权所有,引用请注明原作者,严禁复制转载 Part 1 理论部分 1 传统API接口文档存在的问题? 1 对API接口文档进行更新的时候,需要及时将变化通知前端开发人员&…...
区块链的应用领域:重塑未来的信任机制
区块链作为一种新兴的技术,正在逐渐改变我们的生活。它以其独特的优势,正在开启一个信任的新时代。在金融、供应链管理、医疗健康、教育、文化娱乐、房地产等众多领域,区块链已经崭露头角,以其独特的方式发挥着作用。 1.金融领域…...
怎么在循环List的时候删除List的元素
怎么在循环List的时候删除List的元素 1. 先给出结论 任何时候都不要在 for 循环中删除 List 集合元素 2. 为什么在 for 循环中删除 List 集合元素是错误的 在 for 循环中删除 List 集合元素的问题主要是因为循环的迭代器和 List 集合的元素索引之间的冲突。在使用 for 循环遍历…...

SpringBoot+thymeleaf完成视频记忆播放功能
一、背景 1)客户要做一个视频播放功能,要求是系统能够记录观看人员在看视频时能够记录看到了哪个位置,在下次观看视频的时候能够从该位置进行播放。 2)同时,也要能够记录是谁看了视频,看了百分之多少。 说明:由于时间关系和篇幅原因,我们这里只先讨论第一个要求,第…...
ES 7.12官网阅读-ILM(index lifecycle management)
官网文档:ILM: Manage the index lifecycle | Elasticsearch Guide [7.12] | Elastic ILM:管理 index 的生命周期 可以根据你的性能、弹性、保存时长需求,使用ILM策略来自动管理你的index;比如 1. 当一个index达到确定的大小&a…...

Jenkins执行策略(图文讲解)
Jenkins执行策略-图文讲解 一:手动执行1、手动执行流程2、手动执行操作 二、通过构建触发器——定时执行1、定时执行流程2、定时执行操作 三、当开发部署成功之后进行执行——在测试项配置——关注的项目1、执行流程2、操作流程 四、测试代码有更新的时候自动构建1、…...

1,static 关键字.Java
目录 1.概述 2.定义格式和使用 2.1 静态变量及其访问 2.2 实例变量及其访问 2.3 静态方法及其访问 2.4 实例方法及其访问 3.小结 1.概述 static表示静态,是Java中的一个修饰符,可以修饰成员方法,成员变量。被static修饰后的ÿ…...
网络语义实体对齐(Entity Alignment)相关论文与数据集整理
传统的实体对齐方法主要通过属性相似度匹配的方式实现,利用有监督学习的机器学习模型,如:决策树、支持向量机、集成学习等。依赖实体的属性信息,通过属性相似度,进行跨平台实体对齐关系的推断。基于知识表示学习的方法通过将知识图谱中的实体和关系都映射低维空间向量,直…...

【自动装箱以及包装类的缓存】⭐️通过具体案例看下每种包装类的不同结果
目录 前言 一、自动装箱与拆箱(以 Integer 包装类为例) 二、再来看看几个示例 三、Double ,Float 类型亦是如此吗? 四、补充 前言 小伙伴们大家好,日常使用业务层方面的代码居多,但也不可忘了基本的一些代码格式…...
Java(内部类)
1.内部类 内的五大成员:属性、方法、构造方法、代码块、内部类 解释:在一个类的里面,再定义一个类。举例:在A类的内部定义B类,B类就被称为内部类注意:内部类表示的事物是外部类的一部分,内部类单独出现没…...

c++对象指针
对象指针在使用之前必须先进行初始化。可以让它指向一个已定义的对象,也可以用new运算符动态建立堆对象。 定义对象指针的格式为: 类名 *对象指针 &对象; //或者 类名 *对象指针 new 类名(参数); 用对象指针访问对象数据成员的格式为:…...
js 拼接HTML时 onclick方法和传参报错[onject Object] 和 unexpected end of input`
Vue js拼接onclick事件 1.onclick 方法函数找不到2.方法中传参2.1 int 类型传参(直接传参)2.2 字符串类型(需要加引号)2.3 对象(对象是不能直接拼接的。拼接的必须是字符串。因此需要将对象转成字符串。) 1…...
基于springboot实现定时任务,并且添加Event事件处理机制
1、基于Spring-Event增加事件处理机制 import org.bson.Document; import org.springframework.context.ApplicationEvent;/*** 基于Spring-Event增加事件处理机制* create: 2024/4/1-13:33*/ public class SysProductConfigEvent extends ApplicationEvent {// 数据配置priv…...

深入理解数据结构(1):复杂度详解
文章主题:复杂度详解🌱所属专栏:深入理解数据结构📘作者简介:更新有关深入理解数据结构知识的博主一枚,记录分享自己对数据结构的深入解读。😄个人主页:[₽]的个人主页🔥…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...

算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...