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

前言

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

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

先说同步和异步,针对的对象的是执行任务的对象,他们之间的区别在于任务执行以后,自己处于一个什么样的状态,若是一直等待结果,就是同步;若是当即返回,去干别的事儿经过其余的方法获得结果,就是异步。github

  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是一个线程对应一个流的操做,那么也就是说若是这个流没有结束,线程就须要一直等待。3d

可是NIO不须要,最重要的缘由是选择器和非阻塞。cdn

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

  1. 一个线程从某通道读取数据,若是目前没有数据可用时,就什么都不会获取,而且不会保持线程阻塞,直至数据变的能够读取以前,该线程能够继续作其余的事情。
  2. 一个线程写入一些数据到某通道,但不须要等待它彻底写入,这个线程同时能够去作别的事情

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

NIO的选择器

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


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

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

相关文章
相关标签/搜索