Java IO的各種流是阻塞的。這意味著脖律,當一個線程調(diào)用read() 或 write()時,該線程被阻塞腕侄,直到有一些數(shù)據(jù)被讀取小泉,或數(shù)據(jù)完全寫入芦疏。該線程在此期間不能再干任何事情了。 Java NIO的非阻塞模式微姊,使一個線程從某通道發(fā)送請求讀取數(shù)據(jù)酸茴,但是它僅能得到目前可用的數(shù)據(jù),如果目前沒有數(shù)據(jù)可用時兢交,就什么都不會獲取薪捍。而不是保持線程阻塞,所以直至數(shù)據(jù)變的可以讀取之前配喳,該線程可以繼續(xù)做其他的事情酪穿。 非阻塞寫也是如此。一個線程請求寫入一些數(shù)據(jù)到某通道界逛,但不需要等待它完全寫入昆稿,這個線程同時可以去做別的事情。 線程通常將非阻塞IO的空閑時間用于在其它通道上執(zhí)行IO操作息拜,所以一個單獨的線程現(xiàn)在可以管理多個輸入和輸出通道(channel)溉潭。
Java對BIO、NIO少欺、AIO的支持:
Java BIO : 同步并阻塞喳瓣,服務器實現(xiàn)模式為一個連接一個線程,即客戶端有連接請求時服務器端就需要啟動一個線程進行處理赞别,如果這個連接不做任何事情會造成不必要的線程開銷畏陕,當然可以通過線程池機制改善。
Java NIO : 同步非阻塞仿滔,服務器實現(xiàn)模式為一個請求一個線程惠毁,即客戶端發(fā)送的連接請求都會注冊到多路復用器上,多路復用器輪詢到連接有I/O請求時才啟動一個線程進行處理崎页。
Java AIO(NIO.2) : 異步非阻塞鞠绰,服務器實現(xiàn)模式為一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務器應用去啟動線程進行處理飒焦,
BIO蜈膨、NIO、AIO適用場景分析:
BIO方式適用于連接數(shù)目比較小且固定的架構牺荠,這種方式對服務器資源要求比較高翁巍,并發(fā)局限于應用中,JDK1.4以前的唯一選擇休雌,但程序直觀簡單易理解灶壶。
NIO方式適用于連接數(shù)目多且連接比較短(輕操作)的架構,比如聊天服務器杈曲,并發(fā)局限于應用中例朱,編程比較復雜孝情,JDK1.4開始支持。
AIO方式使用于連接數(shù)目多且連接比較長(重操作)的架構洒嗤,比如相冊服務器箫荡,充分調(diào)用OS參與并發(fā)操作,編程比較復雜渔隶,JDK7開始支持羔挡。
參考
Java NIO詳解
[高并發(fā)Java 八 NIO和AIO]: (https://my.oschina.net/hosee/blog/615269)
[Java IO之 NIO] (https://juejin.im/post/5ab642b56fb9a028c97a025f)