Java雜記10—BIO,BIO和NIO的區別

冰洋發表於2018-05-08

前言

在前文講解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的選擇器允許一個單獨的執行緒來監視多個輸入通道,你可以註冊多個通道使用一個選擇器,然後使用一個單獨的執行緒來“選擇”通道:這些通道里已經有可以處理的輸入,或者選擇已準備寫入的通道。這種選擇機制,使得一個單獨的執行緒很容易來管理多個通道。


我不能保證每一個地方都是對的,但是可以保證每一句話,每一行程式碼都是經過推敲和斟酌的。希望每一篇文章背後都是自己追求純粹技術人生的態度。

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

相關文章