第二节 netty前传-NIO简介

Java NIO是Java的替代IO API(从jdk1.4开始),意味着替代标准Java IO和Java 网络API。 Java NIO提供了与标准IO API不同的使用IO的方式。 java nio有三大核心部分分别是Channel,Buffer 和 Selector 构成了核心的API。其它组件,如Pipe和FileLock,只不过是与三个核心组件共同使用的工具类。下面对先对这三个核心部分简单介绍

  • Java NIO: Channels and Buffers

在标准java的IO API中,使用字节流和字符流。而在NIO中,使用是通道(Channels )和缓冲区(Buffers)。 数据总是从通道读入缓冲区,或从缓冲区写入通道

  • Java NIO: Non-blocking IO

Java NIO能够执行非阻塞IO。 例如,线程可以要求通道将数据读入缓冲区。 当通道将数据读入缓冲区的过程中,线程可以执行其他操作。 一旦数据已被读入缓冲区,线程就可以继续处理它。 将数据写入通道也是如此。

  • Java NIO: Selectors

Java NIO包含 “选择器(Selectors)” 的概念。 Selectors是一个可以监视多个事件通道的对象(例如:连接打开,数据到达、数据读写等)。 因此,单个线程可以监视多个通道的数据。就是nio的多路复用


Buffer

NIO中的关键Buffer实现有:

  • ByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer 分别对应基本数据类型: byte, char, double, float, int, long, short。当然NIO中还有 HeapByteBuffer, DirectByteBuffer表示堆内存和直接内存(少了从系统到虚拟机之间数据的复制操作,所以更快效率更高,但是由于直接内存不由jvm管理所以也更容易出现内存泄漏。) 之后会单独对详细介绍

Channel

Channel和IO中的Stream(流)是差不多一个等级的。不过Stream是单向的,如:InputStream, OutputStream.而Channel是双向的,既可以用来进行读操作,又可以用来进行写操作。 NIO中的Channel的主要实现有:

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel 从上述的名字就可以猜出:分别对应的是文件IO、UDP和TCP(Server和Client)。

Selector

Selector就是上面介绍的选择器。在运行单线程可以处理多个Channel,如果一个应用打开了多个通道,但每个连接的流量都很低(本质上表示每个连接处理很短暂,很快就断开了),使用Selector就会很方便。例如一个消息中间件,在监听某个 topic可类比。通过使用Selector, 在向Selector注册相应的Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪(有消息推送过来)。一旦这个方法返回,线程就可以处理这些事件。

具体例子使用见下一节

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JAVA高级架构

Spring 知识点提炼

1. Spring框架的作用 轻量:Spring是轻量级的,基本的版本大小为2MB 控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,...

40690
来自专栏JavaEdge

掌握 @transactional 注解@Transactional 注解管理事务的实现步骤Spring 的注解方式的事务实现机制

31660
来自专栏潇涧技术专栏

Android Ndk and Opencv Development 2

本节主要介绍的内容是Android NDK开发的核心内容和开发总结(包括很多常见问题的解决方案)。

11820
来自专栏电光石火

关于springboot自动注入出现Consider defining a bean of type 'xxx' in your configuration问题解决方案

搭建完spring boot的demo后自然要实现自动注入来体现spring ioc的便利了,但是我在实施过程中出现了这么一个问题,见下面,这里找到解决办法...

1.6K40
来自专栏java技术学习之道

SpringBoot开发详解 --Controller接收参数以及参数校验

36340
来自专栏Android 研究

Android跨进程通信IPC之7——Binder相关结构体简介

binder_node 代表的是Binder实体对象,每一个service组件或者ServiceManager在Binder驱动程序中的描述,Binder驱动通...

13720
来自专栏依乐祝

ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了

将 Swagger 生成器添加到 Startup.ConfigureServices 方法中的服务集合中:

30110
来自专栏个人分享

Netty服务端与客户端(源码一)

  (4)创建Selector,将之前创建的ServerSocketChannel注册到Selector上,监听SelectionKeyACCEPT。

21120
来自专栏ImportSource

Spring的三种Circuit Breaker

今天我们分享的内容是在spring下的三种circuit breaker的做法。接下来我们分别演示spring cloud netflix hystrix、sp...

86380
来自专栏WindCoder

WebService入门初使用(一)创建WebService服务

本文所用WebService基于maven-ssm-cxf,此处暂时仅使用做记录,后期看心情适当整理相关知识点。

78410

扫码关注云+社区

领取腾讯云代金券