JDK1.7升級了NIO類庫,升級后的NIO類庫被稱為NIO 2.0。
Java正式提供了異步文件I/O操作,同時提供了與UNIX網絡編程事件驅動I/O對應的AIO。
AIO編程
NIO 2.0引入了新的異步通道的概念,并提供了異步文件通道和異步套接字通道的實現。
異步通道獲取獲取操作結果方式:
1.使用java.util.concurrent.Future
類表示異步操作的結果;
2.在執行異步操作的時候傳入一個java.nio.channels
。
操作完成后胡回調CompletionHandler
接口的實現類。
NIO 2.0的異步套接字通道是真正的異步非阻塞I/O,對應于UNIX網絡編程中的事件驅動I/O(AIO)。
AIO版本TimeServer
主程序:
開啟一個線程運行服務,下面是任務類的實現:
CompletionHandler
:
public void completed (AsynchronousSocketChannel result, AsyncTimeServerHandler attachment);
public void failed (Throwable exc, AsyncTimeServerHandler attachment)
接收客戶端連接的回調類:
讀取客戶端的回調類:
AIO版本TimeClient
客戶端:
客戶端回調類:
一點說明
JDK底層通過線程池ThreadPoolExecutor
來執行回調通知,異步回調通知類由sun.nio.ch.AsynchronousChannelGroupImpl
實現,它經過層層調用,最終回調com.phei.netty.aio.AsyncTimeClientHandler$1.completed
方法,完成回調通知。
異步Socket Channel是被動執行對象,我們不需要像NIO編程那樣創建一個獨立的I/O線程來處理讀寫操作。對于AsynchronousServerSocketChannel
和AsynchronousSocketChannel
它們都由JDK底層的線程池負責回調并驅動讀寫操作。正因為如此,基于NIO 2.0新的異步非阻塞Channel進行編程比NIO編程更為簡單。