4种IO流Java

4种IO模型 java相关

1 . 同步阻塞IO

典型的一个就是socket的TCP例子

服务端和客户端交流

类似这样

以下都是伪代码

// server端 阻塞自己直到收到消息
// 没收到 线程被挂起
msg = server.accept()
// 收到再执行
handler(msg)

2. 同步非阻塞IO

// server端 
while(msg=server.accpet() !=null){
	handle(msg)
}

不同于阻塞性的IO,每次都一定有返回值。

3. 多路复用IO

这个 应该是使用最多IO模型了,许多高性能IO框架都是基于多路复用IO

像netty

nio是多路复用IO的基础

多路复用有两种模式Proactor模式和Reactor模式

Proactor 是用于异步IO

Reactor 是用于同步IO

  • Reactor 模式

    通俗理解就是

    老妈(客户端)要我(服务端)中午煮饭
    (事件/或者IO请求),

    但是我现在想打游戏(我不想一直等待时间然后去煮饭),

    我先告诉小爱同学(事件注册器)
    到时候小爱同学的闹钟(条件)提醒我可以去煮饭了(callbakc 回调通知我)
    然后我知道我要去煮饭了(准备完成IO)

    事件注册的 是“我要亲自煮饭这件事“

    回调的结果是 “这件事可以做了”

  • Proactor 模式

    通俗理解就是

    老妈(客户端)要我(服务端)中午煮饭(事件/或者IO请求),

    但是我现在想打游戏(我不想一直等待时间然后去煮饭),

    我先告诉小爱同学我要煮饭(事件分离器)大概一杯米和1.5杯水(数据大小和缓冲区),小爱同学直接启动全自动电饭煲(操作系统)把米倒进去,加上水。电饭煲煮好了,小爱同学知道饭煮好了(完成了IO)。提醒我可以吃饭了(通知我可以吃饭)

    然后我知道了(完成事件了)

    事件注册的 是“我反正要饭煮好怎么实现我不在乎“

    回调的结果是 “这件事按照一杯米1.5杯水的要求做完了”

仔细分析一下Reactor模式 一般都是使用Reactor 模式 ,因为Proactor需要操作系统

处理高并发的IO请求常见有下面3种模式

以下代码及图片来源于

并发包大神Doug Lea

Scalable IO in Java 衔接

建议下载这个pdf学习一下

传统IO模型

在这里插入图片描述

  1. 单Reactor 单处理线程

    一个Reactor 处理所有的请求,包括 io 和其他操作
    在这里插入图片描述

  2. 单Reactor 多处理线程

    Reactor只完成IO ,剩下的交给工作线程去做
    在这里插入图片描述

  3. 多Reactor 多处理线程

    分离了请求和实际操作
    在这里插入图片描述

4 . 异步IO

很少用,需要操作系统

file = socket.getfile(buff,size);
// 等待一段时间
// buff size 中已经有了file
// 告诉我  我收到了
res = server.finishfile()
发布了22 篇原创文章 · 获赞 2 · 访问量 881

猜你喜欢

转载自blog.csdn.net/weixin_41685373/article/details/104973584