Channel延续篇
上篇文章中介绍了NIO中的Channel,从Channel是什么、特性、分类几个方面做了下简单的介绍。但是后面Channel的分类,个人感觉不够全面,容易误导读者,特此以这篇文章加以补充。
Channel概览
这里我们直奔主题,先通过概览性的UML类图总体直观性的感受下Channel
接下来分析下这个UML图。从层次,具体的接口和实现类方面介绍。
一.层次
对于NIO的Channel的模块,Java的设计者们还是用心良苦。层次突出,接口行为的划分精细,职责单一而清晰。
从图中不难看出,Channel主要被分为四层:
- Channel顶层接口
- 根据不同能力划分通道:可读通道、可写通道、网络型通道、异步、可中断
- 基于以上的读写和网络上的能力继续进行分层:聚集(write的内聚)、分散(read的拆分)、可选择性(用于Selector多路复用)
- 各种具体用途的Channel的实现
二.接口和实现
1.第一层
- Channel:作为NIO中通道的最顶层接口,抽象的定义描述了通道的概念,通道可以打开可以关闭的行为
2.第二层
- ReadableByteChannel:代表具有读能力的通道,描述了通道的可读行为,只要具有可读能力的通道都应该实现它
- WriteableByteChannel:代表具有写能力的通道,描述了通道的可写行为,只要具有可写能力的通道都应该实现它
- NetworkChannel:代表网络类型的通道,只要连接到Socket套接字,都需要实现它
- AsynchronousChannel:代表具有异步I/O操作能力的通道,只是定义了通道异步关闭的行为,具有异步读写能力的通道都应该实现它
- InterruptibleChannel:代表可中断式通道,即一个线程阻塞在该通道的I/O上,另一个线程可以关闭通道中断阻塞在该通道上的线程
3.第三层
- SeekableByteChannel:可查找的通道,内部维护位置position,通过位置的切换,实现自由读写
- ScatteringByteChannel:具有分散能力的通道,即从通道中读取数据至多个Buffer缓冲区的能力
- GatheringByteChannel:具有聚集能力的通道,即从多个顺序的Buffer缓冲区中写数据至通道的能力
4.第四层
该层就是具有实际能力的通道,直接与Java应用开发者相关的,应用中直接使用的API。
这里就不再赘述,可移步至我的上篇文章Channel概述,该篇博文中介绍了第四层的相关用途的通道。
本文主要就是为了补充上篇文章,让读者能够对NIO中Channel部分能够有个全局性的认识。后续会详细介绍第四层通道的用途及用法。
转载于:https://www.cnblogs.com/lxyit/p/9141120.html
Channel延续篇相关推荐
- FPS游戏:D3D实现游戏人物上色
本教程是<FPS游戏:实现D3D劫持透视 (API Hook)>教程的延续篇,在上一课我们讲解了如何通过函数劫持,实现对特定角色墙后透视功能,不过我们当时使用的是全局透视,并没有找到人物模 ...
- 云客Drupal源码分析之Session进阶
在本系列之前写过<云客Drupal源码分析之Session系统>,但那部分仅仅讲到了drupal会话的基础:Symfony的Session组件 至于drupal怎么去使用这个基础就是本主题 ...
- Docker Swarm集群仓库和可视化管理
Docker Swarm集群仓库和可视化管理 1 背景 2 环境 3 安装操作 3.1 registary部署 3.1.1 下载 3.1.2 部署 3.2 portainer部署 3.2.1 下载 3 ...
- 国内高校语音信号处理实验室
这是数字音视频编解码技术国家工程实验室(一) 的延续篇,主要是对国内高校语音信号处理教学和理论研究的情况进行一些收集.因为语音数字信号处理是数字信号处理---DSP,通信,人工智能,等学科的一重要分支 ...
- 理解Go的Goroutine和channel
原址 进程,线程的概念在操作系统的书上已经有详细的介绍.进程是内存资源管理和cpu调度的执行单元.为了有效利用多核处理器的优势,将进程进一步细分,允许一个进程里存在多个线程,这多个线程还是共享同一片内 ...
- 图解RAM结构与原理,系统内存的Channel、Chip与Bank
文章目录 转载正文 标题挥发性内存分2种,SRAM和DRAM 主内存子系统 channel 和 DIMM rank 和 chip bank.row.column 内存的读写方式 越多越好,加速读写能力 ...
- 唤醒手腕 Go 语言 并发编程 (goroutine、channel)详细教程(更新中)
线程.协程基本概念 协程是单线程下的并发,又称微线程,纤程.它是实现多任务的另一种方式,只不过是比线程更小的执行单元.因为它自带CPU的上下文,这样只要在合适的时机,我们可以把一个协程切换到另一个协程 ...
- Go 知识点(08) — 对未初始化的 channel 进行读写操作
1. 对未初始化的 channel 进行写操作 先看下面代码 func main() {var ch chan int // 只声明,并没有初始化fmt.Printf("ch is %v\n ...
- Go 知识点(03)— 非缓冲 channel 的长度始终为 0
我们先看下面代码输出通道的长度是多少? func main() {ch := make(chan string)go func() {ch <- "hello"close(c ...
最新文章
- 阿里达摩院:超大规模图神经网络系统将赋予机器常识
- Greasemonkey——打造自己的互联网
- 16道关于Python基础方面的练习题
- Linux系统目录说明
- 忍“乳”负重,身材好的女孩子究竟有多不容易?我从科学的角度算出来了……...
- ef.extensions mysql_EFcore 使用 EFCore.BulkExtensions(不支持mysql)或 EntityFramework-Plus 批量增加、删除、修改...
- java的编程规范_JAVA编程规范-OOP规范
- 苹果macOS Monterey将支持一键恢复出厂设置,无需重装系统
- [记录]Python的master-worker和epoll模式
- Spine 3.8.75 导入Unity报错
- python 实现将RGBA 转换为RGB
- 用Python实现从Oracle到GreenPlum的表结构转换
- 病毒分析 - 特征码提取
- Notepad JSON格式化
- java抽奖系统的设计参考文献,抽奖系统的设计与实现论文范文论文
- NX二次开发-UFUN输入对象获得对象所在的部件tag UF_OBJ_ask_owning_part
- android 手机 多分辨率适配
- word里面怎么在框里打勾
- MATLAB 全景图切割及盒图显示
- stormzhang