zoukankan      html  css  js  c++  java
  • NIO

    NIO 概述

    NIO有三个核心组件:

    • 通道(Channels)
    • 缓存(Buffers)
    • 选择器(Selectors)

    实际上,NIO的组件和类远不止这三个,但这个三个组件是核心。至于其它组件,例如Pipe和FileLock只不过是围绕在三大核心组件旁的实用工具类。因此,本文将重点关注这三个组件。其它组件也会在本系列其它相应的文章里介绍。

    通道和缓存

    在NIO里,所有IO都是从通道开始的。通道和流有点相似,可以将数据从通道读入缓存,也可以将数据从缓存写入通道,图示如下:

    通道和缓存都有多种类型,下面是NIO主要的通道类型列表:

    • FileChannel 文件通道
    • DatagramChannel 数据报通道
    • SocketChannel socket通道
    • ServerSocketChannel serversocket通道

    如你所见,这些通道涵盖了网络IO(包括UDP和TCP)和文件IO。除此之外还有一些有意思的接口,限于篇幅,本文不提及,但在本系列相关文章将做详述。 
    NIO主要的缓存类型如下:

    • ByteBuffer 字节缓存
    • CharBuffer 字符缓存
    • DoubleBuffer 双精度浮点类型缓存
    • FloatBuffer 单精度浮点类型缓存
    • IntBuffer 整型缓存
    • LongBuffer 长整型缓存
    • ShortBuffer 短整型缓存

    这些缓存涵盖了你可以通过IO发送的基本数据类型:byte, short, int, long, float, double 和 char。此外,还有 MappedByteBuffer (映射字节缓存)可用来处理内存映射文件(memory mapped files),此文也不作详述。

    选择器

    选择器允许单线程处理多个通道,这在当程序开了很多通道连接,但每个通道连接的通信量都不大时(比如说聊天服务器)使用起来很方便。下面是单个线程使用选择器来管理三个通道的示意图:

    使用选择器时,首先要将通道注册到选择器,然后调用选择器的select()方法,这个方法会一直阻塞,直到有一个注册了的通道准备就绪触发事件。一旦select()方法返回,线程就可以处理这些事件,诸如连接接入、数据到达等事件。

    完整教程

    完整教程请看

  • 相关阅读:
    JVM -- Full GC触发条件总结以及解决策略
    java实现-图的相关操作
    Integer的intValue()方法
    Java transient关键字
    Redis 单线程模型介绍
    String类的intern()方法 -- 重用String对象,节省内存消耗
    数据库阿里连接池 druid配置详解
    redis 实现发布/订阅模式
    Redis实现队列
    redis 实现分布式锁
  • 原文地址:https://www.cnblogs.com/zedosu/p/6667823.html
Copyright © 2011-2022 走看看