1. 程式人生 > >JAVA中的BIO,NIO,AIO

JAVA中的BIO,NIO,AIO

在瞭解BIO,NIO,AIO之前先了解一下IO的幾個概念:

  1.同步

      使用者程序觸發IO操作並等待或者輪詢的去檢視IO操作是否就緒, 例如自己親自出馬持銀行卡到銀行取錢

  2.非同步

      使用者觸發IO操作以後,可以幹別的事,IO操作完成以後再通知當前執行緒,例如讓小弟去銀行幫你取錢,你可以幹別的事

  3.阻塞

      當試圖進讀寫檔案的時候,發現不可讀取或沒東西讀,則進入等待狀態知道可讀,ATM排隊取錢

  4.非阻塞

      使用者程序訪問資料時,會馬上返回一個狀態值(可讀不可讀),比如在銀行櫃檯辦理業務,先取個號,然後坐在椅子上做其它事,你可以不斷問大堂經理排到了沒有,大堂經理如果說還沒到你就不能去,直到廣播通知你去辦理,(使用非阻塞IO時,如果不能讀寫Java呼叫會馬上返回,當IO事件分發器會通知可讀寫時再繼續進行讀寫,不斷迴圈直到讀寫完成)。

  同步阻塞(JAVA BIO),每一個socket套接字需要使用一個執行緒來處理。建立連線、進行讀寫操作的時候都可能阻塞。在伺服器端如果要支援併發的連線時,需要更多的執行緒。連線不做任何事情的時候會造成不必要的執行緒開銷,可通過執行緒池來改善。

  NIO(同步非阻塞) 基於事件驅動(在程式裡,程式停止在那不動,你點選一個按鈕,它就有反應了,過一會,又沒反應了,你再點一下,它又繼續執行),採用的Reactor模式,(Reactor模式首先是事件驅動的,有一個或多個併發輸入源,有一個Service Handler,有多個Request Handlers;這個Service Handler會同步的將輸入的請求(Event)多路複用的分發給相應的Request Handler。)Reactor會處理所有客戶端的Socket套接字的事件,然後派發到不同的執行緒中。這樣就解決了BIO中為了支撐更多的Socket套接字而需要更多的執行緒。

  AIO(非同步非阻塞)AIO採用了Proactor模式,AIO與NIO的不同之處在於當AIO在進行讀寫操作時,不用先等通知,可直接呼叫相應的read/write方法,這兩種方法均為非同步的,對於讀操作而言,當有流可讀取時,作業系統會將可讀的流傳入read方法的緩衝區,並通知應用程式;對於寫操作而言,當作業系統將write方法傳遞的流寫入完畢時,作業系統主動通知應用程式,而NIO的通知是發生在動作之前的,是在可讀、寫的時候,Selector發現了這些事件後呼叫Handler處理