JAVA NIO通信基础详解

四种IO模型

  1. 同步阻塞IO(Blocking IO)
    阻塞IO是指需要内核IO操作完成后,才返回到用户空间执行用户操作。
    同步IO是指用户空间的线程是主动发起请求IO的一方,内核空间是被动接受方。异步IO则反过来。
    优点:应用程序开发简单,在阻塞期间用户线程挂起不会占用CPU资源。
    缺点:一个线程维护一个链接的IO操作,在高并发的情况下开销很大。
  2. 同步非阻塞NIO(None Blocking IO)
    非阻塞IO是指用户空间不用等待内核IO操作完成,可以执行用户的操作,内核会返回一个状态值给用户空间,需要将socket设置成NONBLOCK。
    优点:每次发起IO调用后,内核会直接返回状态,用户线程不会阻塞。
    缺点:需要不断地进行轮询内核,这将占用大量CPU资源,高并发场景也是不可用的。
  3. IO多路复用(IO Multiplexing)
    Reactor反应器设计模式,有时也叫异步阻塞IO,通过select/epool系统调用,单个应用程序线程可以不断轮询成败上千的scoket链接,当某个链接有IO就绪状态,就返回可以执行读写操作。
    优点:一个选择器查询进程可以同时处理成百上千的链接,系统创建的线程数量大量减少,减小了系统开销。
    缺点:需要在读写就绪后,由系统本身负责读写,读写过程是阻塞的。
  4. 异步 IO模型(Asynchronous IO) AIO
    用户线程通过系统调用,向内核注册IO操作,内核在数据复制完成后通知用户线程,用户线程再进行读写操作,整个过程中用户线程都不用阻塞。

NIO(non-Block IO)和OIO(Old IO)对比
(1) OIO是面向流的,NIO是面向缓冲区的.OIO是面向字节流或者字符流的,以流式的方式从一个流中读取一个或者多个字节,因此不能随意改变读取指针的位置。NIO引入了Channel(通道)和Buffer(缓冲区)的概念。只需从通道读取数据到缓冲区或者从缓冲区写到通道中,可以随意的读取缓冲区的任意位置数据。
(2) OIO是阻塞的,NIO是非阻塞的(多路复用技术)。
(3) OIO没有选择器概念,NIO有选择器,选择器是一个IO事件查询器,可以查询IO事件的就绪状态。
(4) OIO是通过Input Stream 和Out Stream进行输入和输出,NIO的所有IO操作都是通过通道开始的。通道的写入就是将数据从缓冲区写入到通道中,读取就是将数据从通道中读取到缓冲区中。
NIO Buffer详解
本质上是一个内存块,可以进行数据的读取操作。Buffer类是一个非线程安全的。
1. Buffer类的重要属性
Buffer类的内部有一个byte[]数组的内存块作为缓冲区。重要的成员属性capacity(容量),position(读写位置),limit(读写限制)。
capacity(容量):一旦初始化就不能修改,不是指byte[]的大小,而是指写入缓冲区的对象数量。
position(读写位置):表示当前位置,写入模式下初始化为0,最大值为limit-1,读取模式下初始为0,最大值为limit,fip方法可进行读写转换。
limit(读写限制):表示读写最大上限,写入模式下limit被设置为capacity,读取模式下limit表示最多能读到多少数据。

   // 创建缓冲区 新建的缓冲区默认写入模式
        IntBuffer allocate = IntBuffer.allocate(20);
        // 写入数据到缓冲区
        for (int i 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值