• BIO,同步阻塞;NIO:同步非阻塞;

    • 在 NIO 技术之前,服务器侧使用多线程是 BIO 的一种伪阻塞的解决方法;
  • BIO 的多线程机制存在的问题:

    • 每一个 Socket 连接服务器,服务器侧都立刻开启(创建)一个线程处理,
    Socket socket = server.accept();
    while (true) {new Thread(new ServerHandler(socket));
    }
    • 每个 IO 操作完成后,线程就会销毁(IO 线程可以理解为一个数据传输的通道,channel),而线程的创建是比较耗费资源的,奈何取之尽锱铢,而用之如泥沙;
  • NIO 针对这 BIO 的这两个问题,进行如下的改进:

    • 新的 Socket 到来,并不立即开启线程,等到 IO 操作再开启;

      • 这便是 java.nio 的 Selector 选择子(以线程的形式存在),定义三种状态:ACCEPT,Readable,Writable
    public static final int OP_READ = 1 << 0;
    public static final int OP_WRITE = 1 << 2;
    public static final int OP_CONNECT = 1 << 3;
    public static final int OP_ACCEPT = 1 << 4;
    • 每个IO操作完成,也不立即销毁线程;

      • 这便是 java.nio 的 Channel;
    • BIO 的流式读写,不能同时读写。为了支持同时读写,变阻塞为非阻塞,java.nio 提出 Buffer 的概念;

1. buffer 机制

Java NIO Buffer

  • 三大概念:

    • capacity容量
    • position位置
    • limit限制
      • 在写模式,limit的含义是我们所能写入的最大数据量。它等同于buffer的容量。
      • 一旦切换到读模式,limit则代表我们所能读取的最大数据量,他的值等同于写模式下position的位置。
      • 数据读取的上限时buffer中已有的数据,也就是limit的位置(原position所指的位置)。
  • java nio 下的 Buffer Types:

    • ByteBuffer

      • MappedByteBuffer
    • CharBuffer
    • DoubleBuffer
    • FloatBuffer
    • IntBuffer
    • LongBuffer
    • ShortBuffer

Java 并发 —— 从 BIO 到 NIO相关推荐

  1. Java的中BIO、NIO、AIO-1

    Java的中BIO.NIO.AIO-1 java  最近在项目中用到TCP通信来完成命令和运行结果的交互,用的是典型的TCP通信中的C/S架构,原因很简单:在业务需求低的环境下,这种架构简单.稳定还容 ...

  2. java基础IO BIO、NIO、AIO的区别

        Java IO(Java数据流)主要就是Java用来读取和输出数据流.它有对应的一系列API.主要是java.io.*,和java.nio.*. Java中IO主要有两类 |-->字节流 ...

  3. 常见Java面试题 BIO、NIO、AIO 有什么区别?

    BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低. NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通 ...

  4. 【转】深入分析JAVA IO(BIO、NIO、AIO)

    IO的基本常识 1.同步 用户进程触发IO操作并等待或者轮询的去查看IO操作是否完成 2.异步 用户触发IO操作以后,可以干别的事,IO操作完成以后再通知当前线程继续处理 3.阻塞 当一个线程调用 r ...

  5. Java IO:BIO和NIO区别及各自应用场景

    转载请注明出处:jiq•钦's technical Blog - 季义钦 引言 BIO和NIO是两种不同的网络通信模型,现如今NIO已经大量应用在Jetty.ZooKeeper.Netty等开源框架中 ...

  6. 【IO】Java 中的 BIO、NIO、AIO

    在上一篇我们讲了 Linxu 下的五种 IO 模型,操作系统的 IO 模型是底层基石,Java对于IO的操作其实就是进一步的封装.适配一些系统调用方法,让我们玩地更得劲. 1.同步(Synchroni ...

  7. Java IO模型--BIO、NIO Single Thread、NIO Reactor、AIO单线程及多线程AIO

    目录 BIO server端: client端: NIO 单线程模型 Reactor模型 代码实现 AIO 单线程AIO代码实现 线程池AIO代码实现 BIO 当确定客户端连接数很少时,BIO也可以使 ...

  8. java多线程启动BIO和NIO服务端同时启动接受图片和字符数据

    main函数: @MapperScan("com.naughty.userlogin02.dao") @SpringBootApplication public class Use ...

  9. JAVA网络编程→BIO到NIO、IP域名服务器DNS端口、套接字编程Socket、TCP与UDP

    视之不见名曰夷:听之不闻名曰希:搏之不得名曰微. 此三者不可致诘,故混而为一. 其上不皦,其下不昧,绳绳兮不可名,复归于无物. 是谓无状之状,无物之象,是谓惚恍. 迎之不见其首:随之不见其后. 执古之 ...

最新文章

  1. centos7下docker1.12.5学习笔记
  2. 神策数据、阿里、华为、字节等携手推动个人信息保护工作
  3. 3DSlicer9:FAQ-3
  4. python矩阵sin计算器_Python-Numpy科学计算器的基本软件包
  5. STL之remove、remove_copy、remove_if、remove_copy_if
  6. 20165305 第十周课下补做
  7. MySQL:Specified key was too long; max key length is 1000 bytes
  8. [转]『TensorFlow』读书笔记_TFRecord学习
  9. Flume+kafka 整合
  10. jsp内置对象与四种作用域
  11. SIFT@David G. Lowe
  12. OpenERP 7.0入门(一):安装及开发环境部署
  13. 公众号h5拼团购买业务梳理
  14. 加盟店可靠吗?如何识破加盟骗局?
  15. 图片转cad用什么软件?转换有技巧
  16. 新三板上市企业专利数据(含发明专利、实用新型专利、外观设计专利)
  17. 如何用usb电缆连接到计算机,如何使用USB串行电缆将文件从计算机传输到树莓派...
  18. matlab201a教程,实验6 - 数媒201郭凯妮的个人空间 - OSCHINA - 中文开源技术交流社区...
  19. 编程思维训练5:数字反转
  20. 黑马程序员武汉校区 小舞老师 免费资料速速关注领取!!

热门文章

  1. 挂载本地目录到Virtualbox并解决[mounting failed with the error: Protocol error]错误
  2. mysql定义语言_MySQL基础(一)--数据定义语言DDL
  3. ssh-copy-id命令的介绍,使免密更方便
  4. Java异常统一处理
  5. Pytorch专题实战——交叉熵损失函数(CrossEntropyLoss )
  6. 机器学习之非监督学习(六)——聚类(K-Means)
  7. OpenCV实现车牌识别,OCR分割,ANN神经网络
  8. work summary(1)
  9. HiveQL学习笔记(一):Hive安装及Hadoop,Hive原理简介
  10. Thinking with Joins