2.2.2 偽異步式I/O創建的TimeServer源碼分析
我們對服務端代碼進行一些改造,代碼如下。

代碼清單2-4 偽異步I/O的TimeServer

偽異步I/O的主函數代碼發生了變化,我們首先創建一個時間服務器處理類的線程池,當接收到新的客戶端連接的時候,將請求Socket封裝成一個Task,然后調用線程池的execute方法執行,從而避免了每個請求接入都創建一個新的線程。

代碼清單2-5 偽異步I/O的TimeServerHandlerExecutePool

由于線程池和消息隊列都是有界的,因此,無論客戶端并發連接數多大,它都不會導致線程個數過于膨脹或者內存溢出,相比于傳統的一連接一線程模型,是一種改良。
由于客戶端代碼并沒有改變,因此,我們直接運行服務端和客戶端,執行結果如下。服務端運行結果如圖2-6所示。

圖2-6 偽異步I/O時間服務器服務端運行結果
客戶端運行結果如圖2-7所示。

圖2-7 偽異步I/O時間服務器客戶端運行結果
偽異步I/O通信框架采用了線程池實現,因此避免了為每個請求都創建一個獨立線程造成的線程資源耗盡問題。但是由于它底層的通信依然采用同步阻塞模型,因此無法從根本上解決問題。下個小節我們對偽異步I/O進行深入分析,找到它的弊端,然后看看NIO是如何從根本上解決這個問題的。