Java的IO。。。真的是我所见过的高级语言中。最最复杂的。。。

  

  看着这个图我也是醉了。

  但是不知不觉间,java的IO已经更新到了NIO.2了,IO库早已经不止是这个样子了,那么这个过程中,它们经历了怎么样的变化呢?在了解Java的IO之前,我们先来看看几种模型。

咱就是提供独家服务

  在jdk没有推出NIO之前,java使用的IO模型都是BIO(Block Input Output)模型。那么什么是BIO模型呢?

  简单来说就是一对一的服务。好比新开了一家餐厅,来了一位客人,就买一张桌子放到餐厅里面去(应该没有这么蠢的老板吧。。orz.....),来了一千位客人,就放一千张桌子……

    “我去,餐厅不够大啊。。。。怎么破?”

  这个时候只能任性了……

    “买买买!咱再租一个场地,开个新店!”

  这就是传统的BIO模型,相当“任性”的模型,服务端会使用一个Acceptor线程监听客户端的连接,每当一个客户机向服务端发起一个链接,服务端就创建一个线程( Thread),当并发访问量增大,只能通过“买买买”的方法解决问题了。

  那么问题来了,T^T.

  “刚刚是做梦呢!我们真的好穷啊。”

开窍的老板

  “咱搞个排号不就完事了么?”

  咱就这么多桌子,事先都买好了,每次客人坐满了之后,之后来的客人只能在外面等着了(没办法,谁让咱的饭菜就是这么好吃!)。

  这便是伪异步IO模型了。当客户端发起一个请求个服务端,服务端将请求封装成一个任务(Task)放入之前已经准备好的线程池(Thread Pool)。当并发请求数量超过线程池规定的大小时,迟一点发起的线程只能默默在队列中等待线程池中的资源了。

  相比BIO模型,这个模型已经提升了很多性能了。

  但是。。他还是伪异步IO模型!也许是名气太大了。越来越多的客人慕名而来。门口的等地区要挤爆了啊~~如果每桌的客户吃饭的时间又比较长(IO是阻塞的,需要等待IO执行完毕才会释放资源),咱根本hold不住啊!

是时候,展现我们的智慧了

  我们更新了餐厅的排号系统,为了让有限的空间释放出最大的能量,我们也是蛮拼的。我们开始意识到客人是喜欢我们的食物的,那么让客人能及时地享用我们的食物才是最重要的(PM们,明确的需求分析很重要啊!)。

  我们把排号系统放到了网上,大家可以点外卖啊。客人们事先点好需要的食物,我们把食物做好后送到客人面前(服务很贴心,有木有!)。在这个期间,客人们可以去做自己的事情,而不会因为等待时间过长而感到烦躁。

  是的,这就是New IO,java在1.4版本之后,提供了新的IO库,当然在jdk1.7中,NIO已经被升级到NIO.2了。客户端发出请求后,请求会立即返回。当服务端准备好数据后,就会把数据送回客户端。(可以看下我上一篇的博客《Please Call Me NIO》)

总结

  这里简单分析了几个IO模型,接下来,我会结合一些代码继续写几篇blog。

  最后,但愿世界上没有这么无脑的餐厅~

我只是想开个饭店—— JavaIO模型的演变的更多相关文章

  1. JavaIO模型--装饰者模式

    JavaIO体现出装饰者的设计模式 今天在学SparkRDD之前,听了一堂复习JavaIO的课,觉得讲得不错 Java的IO一直让我觉得一层一层的很麻烦,刚接触的时候,理不太清楚 只知道要分解为输入输 ...

  2. JAVA-IO模型(BIO,NIO,AIO)

    基本概念 阻塞和非阻塞 阻塞是进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待, 直到有东西可读或者可写为止 非阻塞是如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等 ...

  3. 聊聊Netty那些事儿之从内核角度看IO模型

    从今天开始我们来聊聊Netty的那些事儿,我们都知道Netty是一个高性能异步事件驱动的网络框架. 它的设计异常优雅简洁,扩展性高,稳定性强.拥有非常详细完整的用户文档. 同时内置了很多非常有用的模块 ...

  4. 基本I/O模型与Epoll简介

    5种基本的I/O模型:1)阻塞I/O ;2)非阻塞I/O; 3)I/O复用(select和poll);4)信号驱动I/O(SIGIO);5)异步I/O(POSIX.1的aio_系列函数). 操作系统中 ...

  5. 第3章 文件I/O(5)_五种I/O模型

    6. I/O处理方式(5种I/O模型) 6.1 几个概念的辨析 (1)同步和异步 ①是访问数据的方式,主要是针对IO(资源.数据)而言的.关键在于I/O操作完成后,有没有提供通知机制. ②同步的IO, ...

  6. 开发分支管理模型之阿里AoneFlow

    说到分支管理模型,令人最为熟悉的莫过于TrunkBased 和 GitFlow. TrunkBased 模型是持续集成思想所崇尚的工作方式,它由单个master分支和许多release分支组成,每个r ...

  7. 深度学习中的序列模型演变及学习笔记(含RNN/LSTM/GRU/Seq2Seq/Attention机制)

    [说在前面]本人博客新手一枚,象牙塔的老白,职业场的小白.以下内容仅为个人见解,欢迎批评指正,不喜勿喷![认真看图][认真看图] [补充说明]深度学习中的序列模型已经广泛应用于自然语言处理(例如机器翻 ...

  8. 从零搭建Pytorch模型教程(四)编写训练过程--参数解析

    ​  前言 训练过程主要是指编写train.py文件,其中包括参数的解析.训练日志的配置.设置随机数种子.classdataset的初始化.网络的初始化.学习率的设置.损失函数的设置.优化方式的设置. ...

  9. 自定义MVC框架---第一章

    MVC基本介绍 介绍:  mvc是一种编程思想,用来解决开发项目的时候,代码如何编写,项目如何架构的问题,更具体一点就是解决多人协同开发时,如何分工协作的问题,从而提升开发效率 举一个例子:有一个人想 ...

随机推荐

  1. JDK7和JDK8一些重要新特性

    jdk7新特性(部分) switch支持字符串 List AutoCloseable接口实现自动关闭,在try()中 新增获取环境信息的工具方法,getJavaHomeDir,getUserHomeD ...

  2. gcc -Wall -pedantic -ansi(转载)

    转载自R-G-Y-CQ的新浪博客 -Wall显示所有的警告信息 -Wall选项可以打开所有类型的语法警告,以便于确定程序源代码是否是正确的,并且尽可能实现可移植性. 对Linux开发人员来讲,GCC给 ...

  3. MyBatis获取插入记录的自增长字段值

    在Mybatis Mapper文件中添加属性“useGeneratedKeys”和“keyProperty”,其中keyProperty是Java对象的属性名! <insert id=" ...

  4. hellocharts的折线图与柱状图的结合之ComboLineColumnChartView

    哼哼,网上找了半天都不全,所以决定自己写一个完整的可以直接贴代码的 test.xml <?xml version="1.0" encoding="utf-8&quo ...

  5. #pg学习#postgresql的安装

    1.按照官网给的步骤编译安装(Mac安装是比较容易的,相比Liunx) cd /Users/renlipeng/Desktop/postgresql-9.5.1 ./configure --prefi ...

  6. Web API返回JSON数据

    对Web API新手来说,不要忽略了ApiController 在web API中,方法的返回值如果是实体的话实际上是自动返回JSON数据的例如: 他的返回值就是这样的: { "Conten ...

  7. HDU5456 Matches Puzzle Game(DP)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5456 Description As an exciting puzzle game for ...

  8. sqlyog重复使用的方法(30天)

    Sqlyog作为一款可视化的数据库管理工具,各种方便我就不说了,但是未经汉化或者绿色过的软件存在30天的生命期,到期后我们就不可以使用了,要摸卸载重装,我们还可以去修改注册表,来延长它的生命期,具体步 ...

  9. Java_类似java.lang.VerifyError: Expecting a stackmap frame at branch target 22 in method的解决方法

    报异常的方法内使用了Java 7的新特性:自动资源释放,类似于try(){},即在try后面跟一括号,在括号里面对一些资源赋值,try里面的代码块执行完毕之后会自动释放try后面的括号中声明的资源. ...

  10. “LC.exe”错误

    错误“LC.exe”已退出,代码为 -1. 可能的原因是: 这个第三方组件是个商业组件,他在组件的主使用类定义了 LicenseProvider(typeof(LicFileLicenseProvid ...