Java中网络IO的实现方式(BIO、NIO、AIO)介绍
在网络编程中,接触到最多的就是利用Socket进行网络通信开发。在Java中主要是以下三种实现方式BIO、NIO、AIO。
关于这三个概念的辨析以前一直都是好像懂,但是表达的不是很清楚,下面做个总结完全辨析清楚。
1. BIO方式
首先我用一个较为通俗的语言来说明:
BIO 就是阻塞IO,每个TCP连接进来服务端都需要创建一个线程来建立连接并进行消息的处理。如果中间发生了阻塞(比如建立连接、读数据、写数据时发生阻碍),线程也会发生阻塞,并发情况下,N个连接需要N个线程来处理。
这种方式的缺点就是:并发情况下效率很低。
下面用一个图示来说明BIO的工作情况
2. NIO方式
NIO是JDK1.4提出的,还是先用一段通俗的话来说明NIO的工作原理:
NIO 也就是非阻塞IO,是基于事件驱动的思想(Reactor线程模型)。对比与BIO来说,NIO使用一个线程来管理所有的Socket 通道,也就是基于Selector机制,当查询到事件时(连接、接受连接、读、写),就会转发给不同的处理线程(handler)。
下面给出Reactor模型的工作应用图:
3. AIO方式
AIO是JDK1.7提出的,也就是异步IO。AIO采用的是Proactor模式。我们首先应该辨析的是AIO和NIO的区别:
(1)NIO的通知是发生在Handler之前;
(2)AIO的通知是发生在读写等处理之后的回调,有通知时表示相关操作已经结束了。
AIO在进行读写操作时,只需要调用相应的read/write方法,并传入CompletionHandler(动作完成时处理器),在动作完成后会调用CompletionHandler。 NIO的通知是发生在动作之前,是在可读可写的时候,Selector发现了这些事件后就通知并调用Handler处理,
下面给出Proactor模式的工作流程图:
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
相关推荐
-
Java中网络IO的实现方式(BIO、NIO、AIO)介绍
在网络编程中,接触到最多的就是利用Socket进行网络通信开发.在Java中主要是以下三种实现方式BIO.NIO.AIO. 关于这三个概念的辨析以前一直都是好像懂,但是表达的不是很清楚,下面做个总结完全辨析清楚. 1. BIO方式 首先我用一个较为通俗的语言来说明: BIO 就是阻塞IO,每个TCP连接进来服务端都需要创建一个线程来建立连接并进行消息的处理.如果中间发生了阻塞(比如建立连接.读数据.写数据时发生阻碍),线程也会发生阻塞,并发情况下,N个连接需要N个线程来处理. 这种方式的缺点就是
-
Java中动态规则的实现方式示例详解
背景 业务系统在应用过程中,有时候要处理"经常变化"的部分,这部分需求可能是"业务规则",也可能是"不同的数据处理逻辑",这部分动态规则的问题,往往需要可配置,并对性能和实时性有一定要求. Java不是解决动态层问题的理想语言,在实践中发现主要有以下几种方式可以实现: 表达式语言(expression language) 动态语言(dynamic/script language language),如Groovy 规则引擎(rule engine
-
浅谈在Java中JSON的多种使用方式
1. 常用的JSON转换 JSONObject 转 JSON 字符串 JSONObject json = new JSONObject(); jsonObject.put("name", "test"); String str = JSONObject.toJSONString(json); JSON字符串转JSON String str = "{\"name\":\"test\"}"; JSONObjec
-
浅谈java中HashMap键的比较方式
先看一个例子 Integer integer=12344; Integer integer1=12344; 在Java中Integer 和Integer1是不相等的,但是如果再执行如下语句 map.put(integer, 1); map.put(integer1, 2); 会发现2会把1覆盖,问题来了,明明是两个不同的对象,为什么,2会把1覆盖呢? 我们看HashMap中添加键的源代码,如下 可以发现我们传进来的键交给了一个hash的成员方法区处理,这里我们看看hash方法的源码 哦,看到这里
-
Java中创建对象的6种方式
目录 背景 创建对象的 6 种方式 方法1:new 一个对象 方法2:克隆一个对象 方法3:类派发一个对象(反射) 方法4:动态加载一个对象(反射) 方法5:构造一个对象(反射) 方法6:反序列化一个对象 总结 背景 本文教你创建对象的 6 种方式,从低端到高端,各种创建方式,总有一个适合你,没有对象的自己生成一个吧! 创建对象的 6 种方式 假设有个女朋友类: @Data @NoArgsConstructor @AllArgsConstructor class GirlFriend { pri
-
Java中的final关键字使用方式
目录 一.final概述 二.使用方式 修饰类 修饰方法 修饰变量 局部变量—引用类型 成员变量 一.final概述 子类可以在父类的基础上改写父类内容,比如,方法重写.那么我们能不能随意的继承API中提供的类,改写其内容呢?显然这是不合适的.为了避免这种随意改写的情况,Java提供了final 关键字,用于修饰不可改变内容.final: 不可改变.可以用于修饰类.方法和变量. 类:被修饰的类,不能被继承. 方法:被修饰的方法,不能被重写. 变量:被修饰的变量,不能被重新赋值. 二.使用方式 修
-
Java中BufferedReader和BufferedWriter使用方式
目录 FileWriter/FileReader BufferedReader/BufferedWriter FileWriter/FileReader 介绍:FileWriter 类从 OutputStreamWriter 类继承而来.该类按字符向流中写入数据. 构造:参数为 File 对象 FileWriter(File file) 参数是文件的路径及文件名(默认是当前执行文件的路径) FileWrite(String filename) 等价于: OutputStreamWriter ou
-
Java框架解说之BIO NIO AIO不同IO模型演进之路
目录 引言 IO模型 1.什么是IO 2.应用程序IO交互 (1)计算机资源统一管理 (2)底层硬件调用统一封装 3.5种IO模型 (1)阻塞型IO (2)非阻塞型IO (3)多路复用IO (4)信号驱动IO (5)异步IO Java中的IO模型 BIO NIO AIO 总结 引言 Netty作为高性能的网络通信框架,它是IO模型演变过程中的产物.Netty以Java NIO为基础,是一种基于异步事件驱动的网络通信应用框架,Netty用以快速开发高性能.高可靠的网络服务器和客户端程序,很多开源框
-
Java 中的io模型详解
1. BIO 我们先看一个 Java 例子: package cn.bridgeli.demo; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; /** * @author bridgel
-
java中的Io(input与output)操作总结(一)
所谓IO,也就是Input与Output的缩写.在java中,IO涉及的范围比较大,这里主要讨论针对文件内容的读写 其他知识点将放置后续章节(我想,文章太长了,谁都没耐心翻到最后) 对于文件内容的操作主要分为两大类 分别是: 字符流 字节流 其中,字符流有两个抽象类:Writer Reader 其对应子类FileWriter和FileReader可实现文件的读写操作 BufferedWriter和BufferedReader能够提供缓冲区功能,用以提高效率 同样,字节流也有两个抽象类:Input
随机推荐
- 浅析Ajax语法
- 链接渐变效果
- 如何判断电子邮件的地址格式是否正确?
- 详解PL/SQL Developer连接本地Oracle 11g 64位数据库
- PHP类继承 extends使用介绍
- 用Nodejs搭建服务器访问html、css、JS等静态资源文件
- Android getReadableDatabase() 和 getWritableDatabase()分析对比
- 10个基于jQuery或JavaScript的WYSIWYG 编辑器整理
- SQL语句实现SQL Server 2000及Sql Server 2005日志收缩(批量)
- 编写针对IE的JS代码两种编写方法
- php 异步调用方法实现示例
- docker安装kong网关的方法示例
- Vuex 单状态库与多模块状态库详解
- JS+HTML实现的圆形可点击区域示例【3种方法】
- WPF InkCanvas绘制矩形和椭圆
- MySQL 5.7并发复制隐式bug实例分析
- vue简单封装axios插件和接口的统一管理操作示例
- PHP 实现 WebSocket 协议原理与应用详解
- 基于vue实现探探滑动组件功能
- AndroidQ(10)黑暗模式适配的实现