首页 > 编程语言 >001.Java网络编程模型——阻塞I/O模型——非阻塞I/O模型——多路复用I/O模型——信号驱动I/O模型——异步I/O模型——Java I/O模型——Java NIO

001.Java网络编程模型——阻塞I/O模型——非阻塞I/O模型——多路复用I/O模型——信号驱动I/O模型——异步I/O模型——Java I/O模型——Java NIO

时间:2022-10-02 11:11:07浏览次数:56  
标签:Java 模型 阻塞 用户 线程 内核

1.9 Java网络编程模型

1.9.1 阻塞I/O模型

阻塞I/O模型是常见的I/O模型,在读写数据时客户端会发生阻塞。阻塞I/O模型的工作流程为: 在用户线程发出I/O请求之后,内核会检查数据是否就绪,此时用户线程一直阻塞等待内存数据就绪;在内存数据就绪后,内核将数据复制到用户线程中,并返回I/O执行结果到用户线程,此时用户线程将解除阻塞状态并开始处理数据。典型的阻塞I/O模型的例子为data = socket.read(),如果内核数据没有就绪,Socket线程就会一直阻塞在read()中等待内核数据就绪。

1.9.2非阻塞I/O模型

非阻塞I/O模型指用户线程在发起一个I/O操作后,无需阻塞可以马上得到内核返回的一个结果。如果内核返回的结果为false,则表示内核数据还没有准备好,需要稍后在发起I/O操作。一旦内核中的数据准备好了,并且在次收到用户线程的请求,内核就会立刻将数据复制到用户线程并将复制的结果通知用户线程。
在非阻塞I/O模型中,用户线程需要不断询问内核数据是否就绪,在内核数据还未就绪时,用户线程可以处理其他任务,在内核数据就绪后可立即获取并执行相应的操作。典型的非阻塞I/O模型一般如下:

while(true){
  data = socket.read();
  if(data == true){ //1:内核数据就绪
    //获取并处理内核数据
    break;
  }else{ //2.内核数据未就绪,用户线程处理其他业务
  }
}

1.9.3多路复用I/O模型

多路复用I/O模型是指多线程并发编程用得较多的模型,Java NIO就是基于多路复用I/O模型实现的。在多路复用I/O模型中会有一个被称为Selector的线程不断轮训多个Socket的状态,只有在Socket有读写事件时,才会通知用户线程进行I/O操作。
剩下的略,讲这些够了。

1.9.4信号驱动I/O模型(略)

1.9.5异步I/O模型

在异步I/O模型中,用户线程会发起一个Asynchronous read操作到内核,内核在接收到Asynchronous read请求后立刻返回一个状态,来说明请求是否成功发起,在此过程中用户线程不会发生任何阻塞。接着,内核会等待数据准备完毕并将数据复制到用户
线程中,在数据复制完成后内核会发送一个信号到用户线程,通知用户线程Asynchronous读操作已完成。在异步I/O模型中,用户线程不需要关心整个I/O操作是如何进行的,只需发起一个请求,在接收到内核返回的成功或失败信号时说明I/O操作已经完成,直接
使用数据即可。

1.9.6Java I/O模型

在整个Java.io包中最重要的是5个类和1个接口。5个类指的是File、OutputStream、InputStream、Writer、Reader,1个接口指的是Serializable.具体的使用方法请参考JDK API

1.9.7Java NIO

Java NIO的实现主要三大核心内容:Selector(选择器)、Channel(通道)和Buffer(缓冲区)。
Java NIO 和 传统的 I/O的最大区别如下:
(1)I/O是面向流的,NIO是面向缓冲区的
(2)传统的I/O流操作是阻塞模型的,NIO的流操作是非阻塞模式的。

标签:Java,模型,阻塞,用户,线程,内核
From: https://www.cnblogs.com/Where-am-i/p/16748388.html

相关文章

  • 【无人机】基于A星算法和B次样条实现危险模型实现无人机三维航迹规划附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 【Java】01基础-06Debug
    1.Debug模式1.1什么是Debug模式是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序。1.2Debug介绍与操作流程如何加断点选......
  • 常用线性回归模型
    多元线性回归多元线性回归是最常用的预测数值型目标的建模方法,也常用于数据分析中的多因素分析。后面几种回归都是在它基础上稍做修改。当特征数多于实例数,某些数据有问题,......
  • java将一个有序数组按是否连续进行分组
    代码:importjava.util.Arrays;importjava.util.Comparator;importjava.util.List;/***@authorliyinlong*@since2022/8/229:45上午*/publicclassSemTest{......
  • Java压缩、解压zip文件
    代码:publicclassZipUtil{/***压缩文件/文件夹**/publicstaticvoidcompress(StringsrcFilePath,StringdestFilePath){Filesrc=......
  • java 类与对象
    1.在创造一个类的时候,如果自定义一个构造函数,那么计算机将不再提供默认构造函数。2.在一个类中,如果该类有无参构造函数和有参构造函数,一个成员变量value且带初值,一个valu......
  • Java lamda表达式 Predicate<T>、BiFunction<T,T,R>、FunctionalInterface 应用实例说
    使用相对应的函数式接口,可使编写程序在某些时候变得更高雅和灵活,下面对各种情况进行说明ps:核心原理就是将方法作为一个参数传到另一个方法,使该方法处理内容更丰富和灵......
  • Demo11_12 java流程控制01小总结
    packagecom.HuanXin.scanner;importjava.util.Scanner;publicclassDemo01_02{publicstaticvoidmain(String[]args){//hasNext()与next()Sca......
  • Java中的运算符
    短路1.true||2.true||3.false||4.true其中走完1表达式就不会再走了节省了不必要的计算1.true&&2.true&&3.false&&4.true其中走完3表达式就不会再走了......
  • JAVA包装类
    *包装类与基本数据类型*包装类是将基本数据类型封装成一个类,包含属性和方法*使用:*在使用过程中,会涉及到自动装箱和自动拆箱*装箱:将基本数据类型转换......