非阻塞

简介: 非阻塞
  • 非阻塞模式下,相关方法都会不会让线程暂停
  • 在 ServerSocketChannel.accept 在没有连接建立时,会返回 null,继续运行
  • SocketChannel.read 在没有数据可读时,会返回 0,但线程不必阻塞,可以去执行其它 SocketChannel 的 read 或是去执行 ServerSocketChannel.accept
  • 写数据时,线程只是等待数据写入 Channel 即可,无需等 Channel 通过网络把数据发送出去
  • 但非阻塞模式下,即使没有连接建立,和可读数据,线程仍然在不断运行,白白浪费了 cpu
  • 数据复制过程中,线程实际还是阻塞的(AIO 改进的地方)

服务器端,客户端代码不变

// 使用 nio 来理解非阻塞模式, 单线程 // 0. ByteBuffer ByteBuffer buffer = ByteBuffer.allocate(16); // 1. 创建了服务器 ServerSocketChannel ssc = ServerSocketChannel.open(); ssc.configureBlocking(false); // 非阻塞模式 // 2. 绑定监听端口 ssc.bind(new InetSocketAddress(8080)); // 3. 连接集合 List channels = new ArrayList<>(); while (true) { // 4. accept 建立与客户端连接, SocketChannel 用来与客户端之间通信 SocketChannel sc = ssc.accept(); // 非阻塞,线程还会继续运行,如果没有连接建立,但sc是null if (sc != null) { log.debug("connected... {}", sc); sc.configureBlocking(false); // 非阻塞模式 channels.add(sc); } for (SocketChannel channel : channels) { // 5. 接收客户端发送的数据 int read = channel.read(buffer);// 非阻塞,线程仍然会继续运行,如果没有读到数据,read 返回 0 if (read > 0) { buffer.flip(); debugRead(buffer); buffer.clear(); log.debug("after read...{}", channel); } } }



目录
相关文章
|
小程序
微信小程序vantweapp自定义侧边栏
微信小程序vantweapp自定义侧边栏
490 0
[simulink] --- 数据字典(下)
[simulink] --- 数据字典(下)
780 0
|
存储 数据安全/隐私保护
忘记被浏览器记住的密码如何找回,如何查看浏览器保存的密码?
现在很多网站都需要注册账号和密码,由于数量众多,每个网站的账号不通用,所有我们经常会用浏览器记录密码功能记住密码,但时间一长就会忘记密码,想换个浏览器登陆或其他原因无法直接查看到密码,下面有2种查看密码的方法仅供参考。
忘记被浏览器记住的密码如何找回,如何查看浏览器保存的密码?
|
5月前
|
人工智能 JavaScript 前端开发
CodeBuddy重构开发:程序员的懒人进化论
本书讲述了2025年一位程序员与CodeBuddy的邂逅,开启编程新时代的故事。Craft智能体实现对话式编程,大幅缩短开发周期;MCP协议打通工具链,提升全链路效率;DeepSeek V3深度理解业务并传承编码风格。在AI辅助下,开发者从工匠转型为指挥家,技术债管理更加高效。书中指出,未来编程大师是善用AI的人,CodeBuddy成为放大人类编程理想的棱镜,展现代码优雅与智慧无限可能。
|
3月前
|
人工智能 自然语言处理 监控
究竟怎样从零开始构建一个实用且高效的AI代理?
产品专家三桥君提出构建高效AI代理的关键步骤包括:明确任务、设计操作流程、构建最小可行产品(MVP)、连接与编排、测试与迭代,以及部署、扩展与优化。通过定义现实任务、编写详细操作流程,并利用提示工程工具构建核心提示,确保代理流畅执行任务。测试阶段包括手动和自动化测试,验证代理在不同场景下的表现。部署后,根据用户反馈和监控数据持续扩展和优化功能,确保代理在实际使用中高效稳定。持续迭代和用户反馈是成功的关键。
165 0
|
存储 缓存 监控
解锁Vuex性能优化的秘密:让大型Vue应用如丝般顺滑,紧跟技术热点,体验速度与效率的双重飞跃!
【8月更文挑战第27天】Vuex是Vue.js应用程序的状态管理解决方案,它允许开发者集中管理组件间共享的状态。然而,在大型应用中,庞大的状态树可能会影响性能。本文介绍几种优化策略:1)精简状态树,避免存储不必要的数据并通过模块化降低复杂度;2)利用getters缓存计算结果以提高效率;3)通过actions处理异步操作,确保状态更新的同步性和逻辑清晰;4)在组件级别上减少不必要的重渲染;5)使用工具如Vue Devtools进行监控和调试。这些方法有助于提升应用的整体性能和用户体验。
272 0
|
域名解析 安全 Java
SpringBoot启动的时候初始化的线程池默认配置tomcat
SpringBoot启动的时候初始化的线程池默认配置tomcat
400 1
|
测试技术 API 数据库
gRPC Status 状态码枚举类型 介绍文档 (更新 gRPC Status 状态码 实操 代码技巧介绍)
gRPC Status 状态码枚举类型 介绍文档 (更新 gRPC Status 状态码 实操 代码技巧介绍)
292 5
|
小程序 Java 数据库
基于SpringBoot学生信息管理系统设计和实现(源码+LW+调试文档+讲解等)
基于SpringBoot学生信息管理系统设计和实现(源码+LW+调试文档+讲解等)
|
运维 关系型数据库 MySQL
面试题MySQL问题之MySQL集群的单点失效如何解决
面试题MySQL问题之MySQL集群的单点失效如何解决
211 2