Java 中的 BIO、NIO 和 AIO 可以理解為是 Java 語言對(duì)操作系統(tǒng)的各種 IO 模型的封裝。在使用這些 API 的時(shí)候,不需要關(guān)心操作系統(tǒng)層面的知識(shí),也不需要根據(jù)不同操作系統(tǒng)編寫不同的代碼,只需要使用 Java 的 API 就可以了。
在講 BIO,NIO,AIO 之前,先來回顧一下這樣幾個(gè)概念:同步與異步,阻塞與非阻塞。
同步與異步
同步: 同步就是發(fā)起一個(gè)調(diào)用后,被調(diào)用者未處理完請(qǐng)求之前,調(diào)用不返回;
異步: 異步就是發(fā)起一個(gè)調(diào)用后,立刻得到被調(diào)用者的回應(yīng),表示已接收到請(qǐng)求,但是被調(diào)用者并沒有返回結(jié)果,此時(shí)我們可以處理其他的請(qǐng)求,被調(diào)用者通常依靠事件、回調(diào)等機(jī)制來通知調(diào)用者其返回結(jié)果。
同步和異步的最大區(qū)別,在于異步的話調(diào)用者不需要等待處理結(jié)果,被調(diào)用者會(huì)通過回調(diào)等機(jī)制來通知調(diào)用者其返回結(jié)果。
阻塞和非阻塞
阻塞: 阻塞就是發(fā)起一個(gè)請(qǐng)求,調(diào)用者一直等待請(qǐng)求結(jié)果返回,也就是當(dāng)前線程會(huì)被掛起,無法從事其他任務(wù),只有當(dāng)條件就緒時(shí)才能繼續(xù);
非阻塞: 非阻塞就是發(fā)起一個(gè)請(qǐng)求,調(diào)用者不用一直等著結(jié)果返回,可以先去干其他的事情。
舉個(gè)生活中簡(jiǎn)單的例子:
你媽媽讓你燒水,小時(shí)候你比較笨啊,在那里傻等著水開(同步阻塞);
等你稍微長(zhǎng)大了,你知道每次燒水的空隙可以去干點(diǎn)其他事,然后只需要時(shí)不時(shí)來看看水開了沒有(同步非阻塞);
再后來,你們家用上了水開了會(huì)發(fā)出聲音的壺,這樣你只需要聽到響聲后,就知道水開了,在這期間你可以隨便干自己的事情,最后才需要去倒水了(異步非阻塞)。