关键抽象

  1.Buffer缓冲区

   NIO数据传递模型,是一个连续的内存区域、所有数据传递均通过buffer类处理;NIO提供了字符串、整形、字节、堆等多种缓冲区。

  2.Channel(通道)

   NIO把它支持的I/O对象抽象为Channel。它模拟了通信连接,类似于原I/O中的流(Stream),用户可以通过它读取和写入数据。目前已知的实例类有SocketChannel、ServerSocketChannel、DatagramChannel、FileChannel等。

  

通道

备注

FileChannel

通过文件中读取数据

DatagramChannel

通过UDP网络读取数据

SocketChannel

通过TCP网络读取数据

ServerSocketChannel

监听新进来的TCP连接,对每一个新进来的连接都会创建一个SocketChannel

  3.SelectionKey事件模型

    NIO的服务端通过一个专门的线程来处理IO相关事件,采用双向通道进行数据传输,而不是单向的通道,通过在通道上注册我们感兴趣的事件来完成一系列操作。

   事件模型如下:  

事件KEY

备注

SelectionKey.OP_ACCEPT

服务器接受客户端请求

SelectionKey.OP_CONNECT

客户端连接服务器事件

SelectionKey.OP_READ

读取事件

SelectionKey.OP_WRITE

写入事件

    

知识点

  一、javaNIO和IO的区别

IO

NIO

面向流

面向缓冲区

阻塞IO

非阻塞IO

选择器/反应堆

  1.阻塞/IO通信模型

   阻塞IO在调用Read()方法时是阻塞的,它会等待数据返回获取超时才会返回;同理在accept方法时是阻塞,会等到有客户端连接才会返回;服务端会为每个客户端连接启动一个线程处理该客户端请求;

   阻塞IO模型示意图如下:

    

  2.javaNIO通信模型

  Java NIO是在jdk1.4中引入的,用户新I/O之说,是非阻塞式I/O。工作原理如下:

  专门线程处理所有IO事件,负责分发;事件驱动机制:事件到达处发,线程之间通信是通过wait,notify等方式通信。减少不必要的线程切换。

    1.Selector(选择器)模式

    Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。示意图如下

 

    2.reactor(反应器)模式

    使用单线程模拟多线程,提高资源利用率和程序的效率,增加系统吞吐量。示意图如下:

  3.服务端与客户端通讯模式

  服务端和客户端各自维护一个管理通道的对象,我们称之为selector,该对象能检测一个或多个通道 (channel) 上的事件。我们以服务端为例,如果服务端的selector上注册了读事件,某时刻客户端给服务端发送了一些数据,阻塞I/O这时会调用read()方法阻塞地读取数据,而NIO的服务端会在selector中添加一个读事件。服务端的处理线程会轮询地访问selector,如果访问selector时发现有感兴趣的事件到达,则处理这些事件,如果没有感兴趣的事件到达,则处理线程会一直阻塞直到感兴趣的事件到达为止。

  下面是我理解的java NIO的通信模型示意图:

小结

  java NIO面向缓存区、非阻塞IO

  处理模式有选择器、反应堆

  基于事件监听模式响应IO流

java NIO 原理解析之学习笔记的更多相关文章

  1. 《Flask Web开发实战:入门、进阶与原理解析》 学习笔记

    一个视图函数可以绑定多个 URL 为了让互联网上的人都可以访问,需要安装程序的服务器有公网ip 如果过度使用扩展,在不需要 的地方引人,那么相应也会导致代码不容易维护 ,应该尽量从实际需求出发,只在需 ...

  2. 图灵学院JAVA互联网架构师专题学习笔记

    图灵学院JAVA互联网架构师专题学习笔记 下载链接:链接: https://pan.baidu.com/s/1xbxDzmnQudnYtMt5Ce1ONQ 密码: fbdj如果失效联系v:itit11 ...

  3. Java程序猿的JavaScript学习笔记(汇总文件夹)

    最终完结了,历时半个月. 内容包含: JavaScript面向对象特性分析,JavaScript高手必经之路. jQuery源代码级解析. jQuery EasyUI源代码级解析. Java程序猿的J ...

  4. Java程序猿的JavaScript学习笔记(8——jQuery选择器)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  5. [JavaEE]Java NIO原理图文分析及代码实现

    转http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别      1. 阻塞I/O通信模型      2. java NIO ...

  6. Java NIO原理分析

    Java IO 在Client/Server模型中,Server往往需要同时处理大量来自Client的访问请求,因此Server端需采用支持高并发访问的架构.一种简单而又直接的解决方案是“one-th ...

  7. Java NIO原理图文分析及代码实现

    原文: http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别      1. 阻塞I/O通信模型      2. java ...

  8. Java程序猿的JavaScript学习笔记(3——this/call/apply)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  9. Java程序猿的JavaScript学习笔记(1——理念)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

随机推荐

  1. Spring Cloud 系列之 Alibaba Nacos 注册中心(一)

    前言 从本章节开始,我们学习 Spring Cloud Alibaba 相关微服务组件. Spring Cloud Alibaba 介绍 Spring Cloud Alibaba 致力于提供微服务开发 ...

  2. 时间序列神器之争:prophet VS lstm

    一.需求背景 我们福禄网络致力于为广大用户提供智能化充值服务,包括各类通信充值卡(比如移动.联通.电信的话费及流量充值).游戏类充值卡(比如王者荣耀.吃鸡类点券.AppleStore充值.Q币.斗鱼币 ...

  3. 【JAVA进阶架构师指南】之五:JVM性能调优

    前言   首先给大家说声对不起,最近属实太忙了,白天上班,晚上加班,回家还要收拾家里,基本每天做完所有事儿都是凌晨一两点了,没有精力再搞其他的了.   好了,进入正题,让我们来聊聊JVM篇最后一个章节 ...

  4. <Win10开发>一些小知识。

    这篇文章分享一下UWP开发的一些零散的小知识. 1.设置应用的最小尺寸 主要用在PC上,UWA在PC可以被鼠标随意摆弄,可大可小,界面的响应式设计是一大特点.不过有些时候还是要考虑,我们的App界面元 ...

  5. [CF914D]Sum the Fibonacci

    题目   点这里看题目. 分析   我们先放宽条件,重新定义五元组\((a,b,c,d,e)\)如下:   1.\(1\le a,b,c,d,e\le n\).   2.\(s_a\&s_b= ...

  6. Charles抓包1-Charles安装汉化(附正版注册码)

    目录 1.下载&&安装 2.汉化 1.下载&&安装 charles官网 charles下载 下载后直接安装即可. 2.汉化 下载提供的汉化包charles.jar(加群 ...

  7. 使用 LIKE 的模糊查询

    字符串匹配的语法格式如下: <表达式1> [NOT] LIKE <表达式2> 字符串匹配是一种模式匹配,使用运算符 LIKE 设置过滤条件,过滤条件使用通配符进行匹配运算,而不 ...

  8. 记录一次Flink作业异常的排查过程

    最近2周开始接手apache flink全链路监控数据的作业,包括指标统计,业务规则匹配等逻辑,计算结果实时写入elasticsearch. 昨天遇到生产环境有作业无法正常重启的问题,我负责对这个问题 ...

  9. 微信小程序踩坑之前端问题处理篇

    近期完成了一个小程序,自己做的前后端开发.真是惨哭我了o(╥﹏╥)o,下面几点希望大家可以避雷. 首先,想先介绍一下我遇到问题的解决思路: 1.先在postman调试接口,看数据获取是否正常, 2.在 ...

  10. weui上传多图片,前端压缩,base64编码

    记录一下在做一个报修功能的心路历程,需求功能很简单,一个表单提交,表单包含简单的文字字段以及图片 因为使用的是weui框架,前面的话去找weui的表单和图片上传组件,说实话,weui的组件写的还不错, ...