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的選擇器容許一個單獨的線程來監視多個輸入通道,你能夠註冊多個通道使用一個選擇器,而後使用一個單獨的線程來「選擇」通道:這些通道里已經有能夠處理的輸入,或者選擇已準備寫入的通道。這種選擇機制,使得一個單獨的線程很容易來管理多個通道。


我不能保證每個地方都是對的,可是能夠保證每一句話,每一行代碼都是通過推敲和斟酌的。但願每一篇文章背後都是本身追求純粹技術人生的態度。

永遠相信美好的事情即將發生。

相關文章
相關標籤/搜索