在前文讲解NIO的时候捎带的提过BIO,BIO就是阻塞IO,是java 1.4出现,主要是经过流来进行相关的IO操做。java
在对BIO进行说明以前,咱们首先来理清楚一些概念,同步,异步,阻塞和非阻塞。git
先说同步和异步,针对的对象的是执行任务的对象,他们之间的区别在于任务执行以后,自己处于一个什么样的状态,若是一直等待结果,就是同步;若是当即返回,去干别的事儿经过其余的方法获得结果,就是异步。github
- 在过去科技不发达的时候,银行取钱都是排队的模式。想取钱就得去排队,直到轮到本身,这就是同步
- 如今去银行通常直接叫号,而后去休息位置休息打游戏,登到轮到本身的时候,会有通知,这就是异步
所谓阻塞和非阻塞针对的对象的是CPU,阻塞blocking、非阻塞non-blocking,CPU在等待结果的过程当中的状态,例如排队的过程当中什么也不作就是阻塞;一边排队,一遍玩王者荣耀就是非阻塞的。对于咱们java而言,在使用中咱们是经过线程来对IO进行调度操做的,那么使用BIO时阻塞的其实是线程。编程
BIO能够说是每个java开发者都熟悉的知识点,因此就不作过多的讲解,接下来主要来讲明一下BIO和NIO的区别。网络
以上是BIO和NIO在理论上的一些区别,而实际上对于文件操做而言(例如文件复制等),BIO和NIO是没有什么区别的,不管是思路仍是基本的处理流程,差异不是很大,能够说仅仅是不一样的一套API而已。异步
可以体现BIO和NIO差异的地方在于网络编程领域。线程
咱们知道BIO的流是阻塞的,所以也就意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据彻底写入,该线程在此期间不能再干任何事情了。在网络编程中,BIO是一个线程对应一个流的操做,那么也就是说若是这个流没有结束,线程就须要一直等待。3d
可是NIO不须要,最重要的缘由是选择器和非阻塞。cdn
所谓非阻塞IO,分为读取和写入:对象
NIO在使用中,线程一般将非阻塞IO的空闲时间用于在其它通道上执行IO操做,一个单独的线程能够管理多个输入和输出通道(channel),此时须要用到的就是选择器,也就是所谓的多路复用。
Java NIO的选择器容许一个单独的线程来监视多个输入通道,你能够注册多个通道使用一个选择器,而后使用一个单独的线程来“选择”通道:这些通道里已经有能够处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。
我不能保证每个地方都是对的,可是能够保证每一句话,每一行代码都是通过推敲和斟酌的。但愿每一篇文章背后都是本身追求纯粹技术人生的态度。
永远相信美好的事情即将发生。