Java杂记10—BIO,BIO和NIO的区别

前言

在前文讲解NIO的时候捎带的提过BIO,BIO就是阻塞IO,是java 1.4出现,主要是通过流来进行相关的IO操作。

在对BIO进行说明之前,我们首先来理清楚一些概念,同步,异步,阻塞和非阻塞。

先说同步和异步,针对的对象的是执行任务的对象,他们之间的区别在于任务执行之后,本身处于一个什么样的状态,如果一直等待结果,就是同步;如果立即返回,去干别的事儿通过其他的方法得到结果,就是异步。

  1. 在过去科技不发达的时候,银行取钱都是排队的模式。想取钱就得去排队,直到轮到自己,这就是同步
  2. 现在去银行一般直接叫号,然后去休息位置休息打游戏,登到轮到自己的时候,会有通知,这就是异步

所谓阻塞和非阻塞针对的对象的是CPU,阻塞blocking、非阻塞non-blocking,CPU在等待结果的过程中的状态,例如排队的过程中什么也不做就是阻塞;一边排队,一遍玩王者荣耀就是非阻塞的。对于我们java而言,在使用中我们是通过线程来对IO进行调度操作的,那么使用BIO时阻塞的实际上是线程。

BIO

BIO

BIO可以说是每一个java开发者都熟悉的知识点,所以就不做过多的讲解,接下来主要来说明一下BIO和NIO的区别。

BIO和NIO的区别

BIO与NIO的区别

以上是BIO和NIO在理论上的一些区别,而实际上对于文件操作而言(例如文件复制等),BIO和NIO是没有什么区别的,不论是思路还是基本的处理流程,差别不是很大,可以说仅仅是不同的一套API而已。

能够体现BIO和NIO差别的地方在于网络编程领域。

我们知道BIO的流是阻塞的,因此也就意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入,该线程在此期间不能再干任何事情了。在网络编程中,BIO是一个线程对应一个流的操作,那么也就是说如果这个流没有结束,线程就需要一直等待。

但是NIO不需要,最重要的原因是选择器和非阻塞。

所谓非阻塞IO,分为读取和写入:

  1. 一个线程从某通道读取数据,如果目前没有数据可用时,就什么都不会获取,并且不会保持线程阻塞,直至数据变的可以读取之前,该线程可以继续做其他的事情。
  2. 一个线程写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情

NIO在使用中,线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,一个单独的线程可以管理多个输入和输出通道(channel),此时需要用到的就是选择器,也就是所谓的多路复用。

NIO的选择器

Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。


我不能保证每一个地方都是对的,但是可以保证每一句话,每一行代码都是经过推敲和斟酌的。希望每一篇文章背后都是自己追求纯粹技术人生的态度。

永远相信美好的事情即将发生。

猜你喜欢

转载自juejin.im/post/5af11395f265da0b8f627e5d