1.阻塞I/O模型
阻塞IO模型是常見的IO模型,在讀寫數據時客戶端會發生阻塞。阻塞IO模型的工作流程為:
1.1在用戶線程發出IO請求之后,內核會檢查數據是否就緒,此時用戶線程一直阻塞等待內存數據就緒;
1.2在內存數據就緒后,內核將數據復制到用戶線程中,并返回I/O執行結果到用戶線程,此時用戶線程將解除阻塞狀態并開始處理數據。
典型的阻塞I/O模型的例子為data= socket.read(),如果內核數據沒有就緒, Socket線程就會一直阻塞在 reado中等待內核數據就緒。
2.非阻塞I/O模型
非阻塞I/O模型指用戶線程在發起一個操作后,無須阻塞便可以馬上得到內核返回的一個結果。如果內核返回的結果為fase,則表示內核數據還沒準備好,需要稍后再發起I/O操作。一旦內核中的數據準備好了,并且再次收到用戶線程的請求,內核就會立刻將數據復制到用戶線程中并將復制的結果通知用戶線程。
在非阻塞IO模型中,用戶線程需要不斷詢問內核數據是否就緒,在內存數據還未就緒時,用戶線程可以處理其他任務,在內核數據就緒后可立即獲取數據并執行相應的操作。典型的非阻塞IO模型一般如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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 ) { //數據處理完畢 break ;} else { //內核數據未處理完成,進行其他線程業務 } } } } |
以上就是Java網絡編程之IO模型阻塞與非阻塞簡要分析的詳細內容,更多關于java模型IO阻塞與非阻塞的資料請關注服務器之家其它相關文章!
原文鏈接:https://blog.csdn.net/DrLai/article/details/119830453