- BIO:線程發起 IO 請求,不管內核是否准備好 IO 操作,從發起請求起,線程一直阻塞,直到操作完成。
- NIO:線程發起 IO 請求,立即返回;內核在做好 IO 操作的准備之后,通過調用注冊的回調函數通知線程做 IO 操作,線程開始阻塞,直到操作完成。
- AIO:線程發起 IO 請求,立即返回;內存做好 IO 操作的准備之后,做 IO 操作,直到操作完成或者失敗,通過調用注冊的回調函數通知線程做 IO 操作完成或者失敗。
- BIO 是一個連接一個線程。
- NIO 是一個請求一個線程。
- AIO 是一個有效請求一個線程。
- BIO:同步並阻塞,服務器實現模式為一個連接一個線程,即客戶端有連接請求時服務器端就需要啟動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,當然可以通過線程池機制改善。
- NIO:同步非阻塞,服務器實現模式為一個請求一個線程,即客戶端發送的連接請求都會注冊到多路復用器上,多路復用器輪詢到連接有I/O請求時才啟動一個線程進行處理。
- AIO:異步非阻塞,服務器實現模式為一個有效請求一個線程,客戶端的 IO 請求都是由 OS 先完成了再通知服務器應用去啟動線程進行處理。
適用場景分析
- BIO 方式適用於連接數目比較小且固定的架構,這種方式對服務器資源要求比較高,並發局限於應用中,JDK1.4 以前的唯一選擇,但程序直觀簡單易理解。
- NIO 方式適用於連接數目多且連接比較短(輕操作)的架構,比如聊天服務器,並發局限於應用中,編程比較復雜,JDK1.4 開始支持。
- AIO 方式使用於連接數目多且連接比較長(重操作)的架構,比如相冊服務器,充分調用OS參與並發操作,編程比較復雜,JDK7開始支持。
內容摘自:https://blog.csdn.net/u013068377/article/details/70312551
結合代碼可參考:https://www.cnblogs.com/barrywxx/p/8430790.html
