柚子快報邀請碼778899分享:一文搞懂NIO、AIO、BIO
柚子快報邀請碼778899分享:一文搞懂NIO、AIO、BIO
在Java的世界里,IO指的是輸入/輸出,也就是我們常說的數(shù)據(jù)讀寫操作。NIO、AIO和BIO是Java中用于數(shù)據(jù)讀寫操作的三種不同的編程模式。
BIO (Blocking IO 同步阻塞IO)
BIO是最傳統(tǒng)的IO模式。在這種模型中,每一個新的客戶端連接都需要創(chuàng)建一個新的線程去處理,每個線程在處理IO操作時是阻塞的。這意味著如果一個線程正在等待網(wǎng)絡(luò)數(shù)據(jù)到達(dá),那在此期間它將不能執(zhí)行任何其他任務(wù)。
BIO模式簡單易懂,但缺點(diǎn)是不適合處理并發(fā)高、連接數(shù)多的應(yīng)用,因?yàn)槊總€新連接都需要一個新線程,而線程是昂貴的操作系統(tǒng)資源,過多的線程會導(dǎo)致資源耗盡。
示例代碼:
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {
// 服務(wù)器線程阻塞等待連接
Socket clientSocket = serverSocket.accept();
// 為每個連接創(chuàng)建新的線程去處理
new Thread(new Runnable() {
public void run() {
// 讀寫數(shù)據(jù)...
}
}).start();
}
NIO (Non-blocking IO 非阻塞IO)
NIO是非阻塞IO模式,是Java 1.4版本引入的一個新的IO機(jī)制,也被稱為New IO。NIO支持面向緩沖區(qū)的(Buffer-oriented)IO操作,并提供了選擇器(Selector)機(jī)制,允許單個線程輪詢多個IO通道(Channel),從而可以管理多個并發(fā)的客戶端連接。
在NIO模式中,線程通常不會阻塞在真實(shí)的IO操作上,當(dāng)沒有數(shù)據(jù)可讀或可寫時,線程可以繼續(xù)做其他事情。這種方式可以提升系統(tǒng)的并發(fā)能力及CPU的利用率。
示例代碼:
Selector selector = Selector.open();
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
serverSocketChannel.socket().bind(new InetSocketAddress(8080));
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
// 選擇器監(jiān)控所有注冊的通道,當(dāng)它們中有需要處理的IO操作時,該方法返回
if (selector.select() > 0) {
Set
Iterator
while (it.hasNext()) {
SelectionKey key = it.next();
// 根據(jù)事件的不同進(jìn)行處理...
it.remove();
}
}
}
AIO (Asynchronous IO 異步IO)
AIO也叫NIO 2,在Java 7中引入,提供了一個完全異步的IO操作方式。它是基于事件和回調(diào)機(jī)制的,可以直接對應(yīng)于操作系統(tǒng)的異步IO。使用AIO時,你可以發(fā)起一個請求后立即做其他事情,當(dāng)IO操作完成時,會得到通知,或者在讀寫操作完成時自動觸發(fā)一個回調(diào)函數(shù)。
AIO適用于連接數(shù)目多但每個連接上的并發(fā)度并不高的應(yīng)用場景,例如,異步地處理成千上萬的連接,而每個連接每次只發(fā)送少量數(shù)據(jù)。
示例代碼:
AsynchronousServerSocketChannel serverSocketChannel = AsynchronousServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(8080));
serverSocketChannel.accept(null, new CompletionHandler
@Override
public void completed(AsynchronousSocketChannel client, Void attachment) {
// 接收下一個連接
serverSocketChannel.accept(null, this);
// 處理當(dāng)前的連接...
}
@Override
public void failed(Throwable exc, Void attachment) {
// 處理失敗情況...
}
});
綜上所述,BIO是阻塞且一個連接一個線程,NIO是非阻塞且使用Selector管理多個連接,AIO是異步可以自動回調(diào)的IO處理模型。
柚子快報邀請碼778899分享:一文搞懂NIO、AIO、BIO
推薦閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。