Java網(wǎng)絡(luò)編程之IO模型阻塞與非阻塞簡要分析
1.阻塞I/O模型
阻塞IO模型是常見的IO模型,在讀寫數(shù)據(jù)時客戶端會發(fā)生阻塞。阻塞IO模型的工作流程為:
1.1在用戶線程發(fā)出IO請求之后,內(nèi)核會檢查數(shù)據(jù)是否就緒,此時用戶線程一直阻塞等待內(nèi)存數(shù)據(jù)就緒;
1.2在內(nèi)存數(shù)據(jù)就緒后,內(nèi)核將數(shù)據(jù)復(fù)制到用戶線程中,并返回I/O執(zhí)行結(jié)果到用戶線程,此時用戶線程將解除阻塞狀態(tài)并開始處理數(shù)據(jù)。
典型的阻塞I/O模型的例子為data= socket.read(),如果內(nèi)核數(shù)據(jù)沒有就緒, Socket線程就會一直阻塞在 reado中等待內(nèi)核數(shù)據(jù)就緒。
2.非阻塞I/O模型
非阻塞I/O模型指用戶線程在發(fā)起一個操作后,無須阻塞便可以馬上得到內(nèi)核返回的一個結(jié)果。如果內(nèi)核返回的結(jié)果為fase,則表示內(nèi)核數(shù)據(jù)還沒準(zhǔn)備好,需要稍后再發(fā)起I/O操作。一旦內(nèi)核中的數(shù)據(jù)準(zhǔn)備好了,并且再次收到用戶線程的請求,內(nèi)核就會立刻將數(shù)據(jù)復(fù)制到用戶線程中并將復(fù)制的結(jié)果通知用戶線程。
在非阻塞IO模型中,用戶線程需要不斷詢問內(nèi)核數(shù)據(jù)是否就緒,在內(nèi)存數(shù)據(jù)還未就緒時,用戶線程可以處理其他任務(wù),在內(nèi)核數(shù)據(jù)就緒后可立即獲取數(shù)據(jù)并執(zhí)行相應(yīng)的操作。典型的非阻塞IO模型一般如下:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Test7 {
public static void main(String[] args) throws IOException {
ServerSocket socket=new ServerSocket();
while(true){
Socket data=socket.accept();
if (data!=null) {
//數(shù)據(jù)處理完畢
break;}
else {
//內(nèi)核數(shù)據(jù)未處理完成,進(jìn)行其他線程業(yè)務(wù)
}
}
}
}
以上就是Java網(wǎng)絡(luò)編程之IO模型阻塞與非阻塞簡要分析的詳細(xì)內(nèi)容,更多關(guān)于java模型IO阻塞與非阻塞的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決mybatisPlus 中的field-strategy配置失效問題
這篇文章主要介紹了解決mybatisPlus 中的field-strategy配置失效問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
spring?controller層引用service報空指針異常nullpointExceptio問題
這篇文章主要介紹了spring?controller層引用service報空指針異常nullpointExceptio問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02

