首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java AIO 異步網路 IO 深度探索與框架設計

     編輯:Java 相關知識

IO 模型分類

依《Unix 網路編程》:阻塞 IO、非阻塞 IO、IO 多路複用、信號驅動 IO、異步 IO。POSIX 標準僅分同步 IO(實際讀寫阻塞請求線程)與異步 IO(OS 完成讀寫後通知結果)。Java NIO 2.0 引入異步 IO(AIO),含檔案與網路兩大類。

AIO 核心類與介面

類/介面角色
AsynchronousChannel標記支援異步操作的 Channel
AsynchronousServerSocketChannelTCP Server 端,綁定/監聽/接受連線
AsynchronousSocketChannelTCP 連線通道,異步讀寫
AsynchronousChannelGroupChannel 群組,綁定線程池共享資源,扮演 Proactor 角色
CompletionHandler<V,A>異步操作完成回調:completed/failed/cancelled

Proactor vs Reactor 模式

  • Reactor (NIO):用戶線程註冊 OP_WRITE,Selector 通知可寫,用戶線程執行實際寫入。
  • Proactor (AIO):發起異步 write + CompletionHandler,OS 完成寫入後線程池派發回調,用戶線程完全不參與 IO 操作。

AsynchronousChannelGroup 即 Proactor 實現,三種建立方式:

withFixedThreadPool(nThreads, factory)
withCachedThreadPool(executor, initialSize)
withThreadPool(executor)

TCP Server 啟動全流程

  1. 建立 AsynchronousChannelGroup(綁定快取線程池)。
  2. AsynchronousServerSocketChannel.open(group) 開啟伺服器通道。
  3. 設定 SocketOption:SO_REUSEADDR、SO_RCVBUF。
  4. bind(new InetSocketAddress("localhost",8080), 100) 綁定端口,backlog=100。
  5. 發起首次 accept(null, AcceptHandler) 等待連線。

AcceptHandler 關鍵邏輯

public void completed(AsynchronousSocketChannel ch, Object att) {
    configureChannel(ch); // 設定 TCP_NODELAY 等
    AioSession session = new AioTCPSession(config, readBufferSize, timeout);
    session.start(); // 內部發起 pendingRead()
    registerSession(session);
    pendingAccept(); // 關鍵:遞歸發起下一次 accept
}

注意:回調執行於群組線程池,嚴禁阻塞/長耗時操作,否則耗盡線程池導致系統卡死。

讀寫流程

讀

  • Session 啟動即 pendingRead():channel.read(buffer, this, readHandler)。
  • 回調 completed(bytesRead):bytesRead < 0 表示對端關閉 → 關閉連線;>0 翻轉 buffer → decode() 解碼訊息 → compact() → 再次 pendingRead()。
  • 業務解碼建議派發至獨立業務線程池,避免佔用 IO 線程池。

寫

  • 寫入隊列為空時發起 pendingWrite(msg):channel.write(buffer, this, writeHandler)。
  • 回調 completed(bytesWritten):檢查 buffer 是否剩餘,無剩餘則從隊列移除並觸發 onMessageSent;若隊列仍有訊息 → 繼續 pendingWrite。

框架設計建議

  • 超時管理:定時掃描 Session 最後活動時間。
  • 緩衝區策略:動態擴容 ByteBuffer,避免頻繁分配。
  • 層次分離:IO 層(AIO)、協議層(編解碼)、業務層(Handler)解耦。
  • 擴展性:支援 SSL、WebSocket、自定義協議插件化。
  • 記憶體管理:Java 單一堆模型在高併發下 GC 壓力大,極致效能仍需 C++/Rust 或 Erlang 進程隔離堆模型。

參考專案

程式碼片段來源於 yanf4j AIO 分支:SVN 地址。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved