Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。NIO可以理解为非阻塞IO,传统的IO的read和write只能阻塞执行,线程在读写IO期间不能干其他事情,比如调用socket.read()时,如果服务器一直没有数据传输过来,线程就一直阻塞,而NIO中可以配置socket为非阻塞模式。

Java NIO是在jdk1.4开始使用的,它既可以说成“新I/O”,也可以说成非阻塞式I/O。

下面是java NIO的工作原理:

1.由一个专门的线程来处理所有的IO事件,并负责分发。

2.事件驱动机制:事件到的时候触发,而不是同步的去监视事件。

3.线程通讯:线程之间通过wait,notify等方式通讯。保证每次上下文切换都是有意义的。减少无谓的进程切换。

阅读过一些资料之后,下面贴出我理解的java NIO的工作原理图:

(注:每个线程的处理流程大概都是读取数据、解码、计算处理、编码、发送响应。)

Java NIO的服务端只需启动一个专门的线程来处理所有的IO事件,这种通信模型是怎么实现的呢?我们一起来探究它的奥秘吧。java NIO采用了双向通道(channel)进行数据传输,而不是单向的流(stream),在通道上可以注册我们感兴趣的事件。一共有以下四种事件:

事件名对应值:

服务端接收客户端连接事件 SelectionKey.OP_ACCEPT(16)

客户端连接服务端事件 SelectionKey.OP_CONNECT(8)

读事件 SelectionKey.OP_READ(1)

写事件 SelectionKey.OP_WRITE(4)

在NIO中有三大核心组件:Channel,Buffer,Selector,传统的IO面向流的,每次可以从流中读取一个或多个字节,只能向后读取,不能向前移动,NIO是面向缓冲区的,把数据读到一个缓冲区中,可以在缓冲区中向前/向后移动,增加了程序的灵活性。在NIO中,所有的数组都需要通过Channel传输,通道可以直接将一块数据映射到内存中。Channel是双向的,不仅可以读取数据,还能保存数据,程序不能直接读写Channel通道,Channel只与Buffer缓冲区交互。
  
希望以上的分享能帮到大家!本文来自千锋教育,转载请注明出处。

Java技术分享:NIO实战教程!相关推荐

  1. 叩丁狼分享—培训实战教程之浅谈过滤器Filter

    一.过滤器的基本概念Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应. 主要用于对HttpServletRequest 进行预处理,也可以对Htt ...

  2. 技术分享 | 无人机仿真教程-Prometheus平台 -转自阿木实验室

    技术分享 | 无人机仿真教程-Prometheus平台 转载链接: 前言 具体操作流程: 注意 2.室内仿真 offboard模式 ENU_FRAME :无人机飞行到指定位置 BODY_FRAME : ...

  3. Java技术分享:什么是数据库连接池?

    在JDBC编程中,每次创建和断开Connection对象都会消耗一定的时间和IO资源.这是因为在Java程序与数据库之间建立连接时,数据库端要验证用户名和密码,并且要为这个连接分配资源.Java程序则 ...

  4. 最新Java培训-NIO实战教程

    Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式.NIO可以理解为非阻塞IO,传统的 ...

  5. MyCat:第二章:Mycat前世今生(1),java技术分享主题

    高可用性: 分片节点dn2_M1配置了两个dataSource,并且配置了心跳检测(heartbeat)语句,在这种配置下,每个dataNode会定期对当前 正在使用的dataSource执行心跳检测 ...

  6. Java技术分享:Lambda表达式之接口实例化

    今天小千给大家分享的技术是:Lambda表达式之接口实例化. Lambda表达式是Java SE 8中一个重要的新特性.lambda表达式允许你通过表达式来代替功能接口. lambda表达式就和方法一 ...

  7. Java技术分享之函数式编程

    Java是一种计算机编程语言,可用于编写桌面应用程序.Web应用程序.分布式系统和嵌入式系统应用程序等,是IT开发行业中最受欢迎的编程语言之一.想要学好Java必须要一步一个脚印打好基础.积攒实战经验 ...

  8. Java游戏项目之“超级玛丽”实战教程,终于可以制作属于自己的小游戏了

    刚开始学习Java的时候其实并不是很清楚它可以做些什么,只知道是一门谋生的技能,行业发展也很不错,之后有人说Java可以开发属于自己的小游戏,这兴趣不就来了吗,这说什么我也要学一学,到今天终于可以拿出 ...

  9. 网优谷Java技术分享交流

    自变量是临时性存储在运行内存中的标识符,能够根据自变量的值来获得全部程序流程不正确的缘故: 比如:自变量为空是就是说程序流程沒有运作到该处,自变量的值和预估的不同得话就是说逻辑性难题. javas变量 ...

最新文章

  1. 是时候改变自学编程方法了,这篇国外网友的教程被fast.ai创始人点赞
  2. C++中成员函数和成员变量的隶属问题
  3. Web开发的那点事--业务层常用功能
  4. python随机数种子通俗_在种子中生成随机数
  5. 千呼万唤始出来,OpenCV 4.0正式发布!
  6. 【干货】写给初中级前端的高级进阶指南
  7. 转:PHP中文乱码问题
  8. Android中使用Fragment实现标题栏(不可滑动)
  9. 安卓游戏广告加速插件_大杀器一款超级良心的免费游戏加速器,PC、安卓、iOS都可使用...
  10. 信息学奥赛一本通1368 对称二叉树
  11. TonglinkQ8基于linux 7.5的安装
  12. 什么是对象存储?OSD架构及原理
  13. 电商技术解密之商品详情页
  14. 如何修改ppt已有的版式
  15. 读《有效管理的5大兵法》笔记摘录(一)核心价值观:求实、进取、创新、协同、分享
  16. LPC1768 移植freeRTOS
  17. deeplearning.ai课程作业:Recurrent Neural Networks- Course 5 Week3
  18. 第一章-总论财务管理概述
  19. Coremail论客全球安全生态合作伙伴召集令正式启动
  20. c语言单元测试(cunit)打桩,如何写打桩文件

热门文章

  1. T-GANs:基于“图灵测试”的生成对抗模型
  2. 招募 | 清华大学计算机系副教授黄民烈招募NLP方向博士后
  3. 直播预告 | 东南大学周张泉:基于知识图谱的推理技术
  4. ACM公选课第八节DP基础3 2020.4.23-5.10补
  5. 腾讯云短信出现there are both domestic mobile phone numbers and international mobile phone numbers in the...
  6. springboot+springsecurity+mybatis+jwt实现单点登录(详细到爆了)
  7. 《数据库系统实训》实验报告——子查询与组合查询
  8. BugKuCTF WEB 域名解析
  9. 一致性hash算法使用
  10. Spring-学习笔记03【Spring的IOC和DI】