在之前的幾篇部落格中,我們的伺服器已經具備雛形了,我們還需要繼續對其進行優化,在《java簡易web伺服器(三)》中,我們啟動伺服器的方法如下:
我們是在一個線程中啟動我們的伺服器,避免阻塞主線程,但是這樣,依然存在的問題是,我們的伺服器一次隻能處理一個請求,這樣肯定是不合理的,是以在這一篇部落格中,我們将使用多線程對服務端進行優化。
進一步的優化方式:使用多線程,我們可以在接收到請求後開辟新線程進行處理,代碼如下:
這裡,一旦tcp連接配接建立之後,将會建立一個新的線程來處理新的請求,在新的線程中執行handlerequest方法。
通過建立新的線程,程式可以繼續接受新的tcp連接配接,且這些請求可以并行的處理。
在每個請求一個線程實作中,建立一個線程(和後續的銷毀)開銷是非常昂貴的,因為jvm和作業系統都需要配置設定資源。另外,上面的實作還有一個問題,即建立的線程數是不可控的,這将可能導緻系統資源被迅速耗盡。
是以我們應該繼續尋找解決方案:線程池
使用線程池可以更好的管理我們建立的線程,jdk為我們提供了幾種預設的線程池實作,當線程池滿後,後續的請求我們是用丢棄的政策,是以在這裡面們使用自定義的線程池,完整的<code>hqhttpserver</code>代碼如下: