Java網(wǎng)絡(luò)編程之IO模型阻塞與非阻塞簡要分析
1.阻塞I/O模型
阻塞IO模型是常見的IO模型,在讀寫數(shù)據(jù)時(shí)客戶端會(huì)發(fā)生阻塞。阻塞IO模型的工作流程為:
1.1在用戶線程發(fā)出IO請求之后,內(nèi)核會(huì)檢查數(shù)據(jù)是否就緒,此時(shí)用戶線程一直阻塞等待內(nèi)存數(shù)據(jù)就緒;
1.2在內(nèi)存數(shù)據(jù)就緒后,內(nèi)核將數(shù)據(jù)復(fù)制到用戶線程中,并返回I/O執(zhí)行結(jié)果到用戶線程,此時(shí)用戶線程將解除阻塞狀態(tài)并開始處理數(shù)據(jù)。
典型的阻塞I/O模型的例子為data= socket.read(),如果內(nèi)核數(shù)據(jù)沒有就緒, Socket線程就會(huì)一直阻塞在 reado中等待內(nèi)核數(shù)據(jù)就緒。
2.非阻塞I/O模型
非阻塞I/O模型指用戶線程在發(fā)起一個(gè)操作后,無須阻塞便可以馬上得到內(nèi)核返回的一個(gè)結(jié)果。如果內(nèi)核返回的結(jié)果為fase,則表示內(nèi)核數(shù)據(jù)還沒準(zhǔn)備好,需要稍后再發(fā)起I/O操作。一旦內(nèi)核中的數(shù)據(jù)準(zhǔn)備好了,并且再次收到用戶線程的請求,內(nèi)核就會(huì)立刻將數(shù)據(jù)復(fù)制到用戶線程中并將復(fù)制的結(jié)果通知用戶線程。
在非阻塞IO模型中,用戶線程需要不斷詢問內(nèi)核數(shù)據(jù)是否就緒,在內(nèi)存數(shù)據(jù)還未就緒時(shí),用戶線程可以處理其他任務(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)文章
關(guān)于java四舍五入方法的基礎(chǔ)學(xué)習(xí)
這篇文章主要給大家介紹了關(guān)于java四舍五入方法的基礎(chǔ)學(xué)習(xí),這是最近做算法題的時(shí)候碰到的這個(gè)問題,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07Spring Boot+Nginx實(shí)現(xiàn)大文件下載功能
相信很多小伙伴,在日常開放中都會(huì)遇到大文件下載的情況,大文件下載方式也有很多,比如非常流行的分片下載、斷點(diǎn)下載;當(dāng)然也可以結(jié)合Nginx來實(shí)現(xiàn)大文件下載,在中小項(xiàng)目非常適合使用,這篇文章主要介紹了Spring Boot結(jié)合Nginx實(shí)現(xiàn)大文件下載,需要的朋友可以參考下2024-05-05java socket實(shí)現(xiàn)聊天室 java實(shí)現(xiàn)多人聊天功能
這篇文章主要為大家詳細(xì)介紹了java socket實(shí)現(xiàn)聊天室,java實(shí)現(xiàn)多人聊天功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07response.setContentType()參數(shù)以及作用詳解
這篇文章主要介紹了response.setContentType()參數(shù)以及作用詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08java ExecutorService CompletionService線程池區(qū)別與選擇
這篇文章主要為大家介紹了java ExecutorService CompletionService線程池區(qū)別與選擇使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09java用接口、多態(tài)、繼承、類計(jì)算三角形和矩形周長及面積的方法
這篇文章主要介紹了java用接口、多態(tài)、繼承、類計(jì)算三角形和矩形周長及面積的方法,涉及java面向?qū)ο笾蓄?、接口、多態(tài)等的使用技巧,需要的朋友可以參考下2015-05-05