首页 > 编程语言 >java nio

java nio

时间:2023-10-09 15:57:16浏览次数:46  
标签:java nio 阻塞 线程 事件 IO Channel NIO

Java NIO(New IO 或 Non Blocking IO)是从 Java 1.4 版本开始引入的一个新的 IO API,可以替代标准的 Java IO API。NIO 支持面向缓冲区的、基于通道的 IO 操 作。NIO 将以更加高效的方式进行文件的读写操作

阻塞IO

通常在进行同步I/O操作时,如果读取数据,代码会阻塞直至有可供读取的数据。同样,写入调用将会阻塞直至数据能够写入。传统的Server/Client模式会基于TPR(Thread per Request),服务器会为每个客户端请求建立一个线程,由该线程单独负责处理一个客户请求。这种模式带来的一个问题就是线程数量的剧增,大量的线程会增大服务器的开销。大多数的实现为了避免这个问题,都采用了线程池模型,并设置线程池线程的最大数量,这由带来了新的问题,如果线程池中有200个线程,而有200个用户都在进行大文件下载,会导致第201个用户的请求无法及时处理,即便第201个用户只想请求一个几KB大小的页面。

非阻塞 IO(NIO)

NIO中实现非阻塞I/O的核心对象就是Selector,Selector就是注册各种I/O事件地 方,而且当那些事件发生时,就是这个对象告诉我们所发生的事件
当有读或写等任何注册的事件发生时,可以从Selector中获得相应的SelectionKey,同时从 SelectionKey中可以找到发生的事件和该事件所发生的具体的SelectableChannel,以获得客户端发送过来的数据
非阻塞指的是IO事件本身不阻塞,但是获取IO事件的select()方法是需要阻塞等待的.区别是阻塞的IO会阻塞在IO操作上, NIO阻塞在事件获取上,没有事件就没有IO, 从高层次看IO就不阻塞了
NIO的本质是延迟IO操作到真正发生IO的时候,而不是以前的只要IO流打开了就一直等待IO操作。

NIO原理及通信模型
1.由一个专门的线程来处理所有的 IO 事件,并负责分发
2.事件驱动机制:事件到的时候触发,而不是同步的去监视事件。
3.线程通讯:线程之间通过 wait,notify 等方式通讯。保证每次上下文切换都是有意义的。减少无谓的线程切换

java NIO采用了双向通道(channel)进行数据传输,而不是单向的流(stream),在通道上可以注册我们感兴趣的事件。一共有以下四种事件:
服务端接收客户端连接事件SelectionKey.OP_ACCEPT(16)
客户端连接服务端事件SelectionKey.OP_CONNECT(8)
读事件SelectionKey.OP_READ(1)
写事件SelectionKey.OP_WRITE(4)

服务端和客户端各自维护一个管理通道的对象,我们称之为selector,该对象能检测一个或多个通道 (channel) 上的事件。我们以服务端为例,如果服务端的selector上注册了读事件,某时刻客户端给服务端发送了一些数据,阻塞I/O这时会调用read()方法阻塞地读取数据,而NIO的服务端会在selector中添加一个读事件。服务端的处理线程会轮询地访问selector,如果访问selector时发现有感兴趣的事件到达,则处理这些事件,如果没有感兴趣的事件到达,则处理线程会一直阻塞直到感兴趣的事件到达为止。

java NIO的通信模型示意图:

Channel和Buffer有好几种类型。下面是JAVA NIO中的一些主要Channel的实现:

FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel

这些通道涵盖了UDP 和 TCP 网络IO,以及文件IO。

Selector允许单线程处理多个 Channel。如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便。例如,在一个聊天服务器中。

所有的 IO 在NIO 中都从一个Channel 开始。Channel 有点象流。 数据可以从Channel读到Buffer中,也可以从Buffer 写到Channel中。

要使用Selector,得向Selector注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新连接进来,数据接收等。

Java NIO 还有个 MappedByteBuffer,用于表示内存映射文件

标签:java,nio,阻塞,线程,事件,IO,Channel,NIO
From: https://www.cnblogs.com/jis121/p/17751951.html

相关文章

  • Java Hutool递归解压文件
    importcn.hutool.core.io.FileUtil;importcn.hutool.core.util.ZipUtil;importjava.io.File;importjava.nio.charset.Charset;publicclassRecursiveUnzip{finalstaticFiledestDir=newFile("D:\\python\\newProject\\excel");pub......
  • Java11配置maven
    这里假设Java11和maven都正确安装,使用的版本为Java11、maven3.6.1测试环境变量Javawin+r打开运行,输入cmd,打开命令行提示符,输入java--version如下C:\Users\siyu>java--versionopenjdk11.0.22019-01-15OpenJDKRuntimeEnvironment18.9(build11.0.2+9)OpenJDK64-......
  • 数据重整:用Java实现精准Excel数据排序的实用策略
    摘要:本文由葡萄城技术团队原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。前言在数据处理或者数据分析的场景中,需要对已有的数据进行排序,在Excel中可以通过排序功能进行整理数据。而在Java中,则可以借助Excel表格插件对数......
  • 利用 Javascript 生成数字序列
    <!DOCTYPEhtml><html><head><title>生成数字序列</title></head><body><h1>Element对象之innerHTML属性</h1><pid="demo"onclick="myFunction()">点击生成数字序列</p><script>funct......
  • Java设计模式之适配器模式
    1.1.概述如果去欧洲国家去旅游的话,他们的插座如下图最左边,是欧洲标准。而我们使用的插头如下图最右边的。因此我们的笔记本电脑,手机在当地不能直接充电。所以就需要一个插座转换器,转换器第1面插入当地的插座,第2面供我们充电,这样使得我们的插头在当地能使用。生活中这样的例子很......
  • Java21上手体验-分代ZGC和虚拟线程 | 京东云技术团队
    一、导语几天前Oracle刚刚发布了Java21,由于这是最新的LTS版本,引起了大家的关注。我也第一时间在个人项目中进行了升级体验。一探究竟,和大家分享。二、Java21更新内容介绍官方release公告:https://jdk.java.net/21/release-notes开源中国介绍:https://my.oschina.net/waylau/blog/10......
  • java.util.Objects
      {//对象判空Integerinteger=newInteger(1);if(Objects.isNull(integer)){System.out.println("对象为空");}if(Objects.nonNull(integer)){System.out.printl......
  • Java设计模式之建造者模式
    1.1.概述将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。• 分离了部件的构造(由Builder来负责)和装配(由Director负责)。从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况。• 由于实现了构建和装配的解耦。不同的构建器,相......
  • Java-网络编程(TCP-UDP)
    Java-网络编程(TCP-UDP)网络基础网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的。中间最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析,当然最后再做一些处理,代码、开......
  • JavaScript获取浏览器的显示区域大小测试
    JavaScript获取浏览器的显示区域大小测试Nowwegetthescreensizeaboutthisbrowser网页可见区域宽document.body.clientWidth:1912px网页可见区域高document.body.clientHeight:958px网页可见区域宽(包括边线的宽)document.body.offsetWidth:1896px网页可见区域高(包......