官术网_书友最值得收藏!

1.5 多線程如何應用到實際場景

線程本質上是一個工具,它必須依托于相關的業(yè)務場景來使用。就像Java中的集合,我們會在涉及數(shù)據(jù)存儲的地方用到。

而線程的使用場景,是根據(jù)線程異步和并行執(zhí)行的特性來決定的,這些特性可以提升程序的處理性能,比如:

? 網(wǎng)絡請求分發(fā)場景:針對每個請求連接,可以通過分配一個線程去處理,從而提升服務端處理的連接數(shù),比如Tomcat就是采用線程來處理客戶端請求的。

? 文件導入的場景:當有較大的文件導入時,我們可以先對文件進行解析,然后以每10000條數(shù)據(jù)作為一個任務給線程來處理,這樣可以提升文件處理的效率。

? 異步業(yè)務場景:如支付場景中,客戶端發(fā)起支付請求,服務端收到支付請求后,先不直接調用渠道進行支付,而是先返回給用戶一個處理成功的結果,再通過異步線程的方式觸發(fā)這個支付請求。

為了更好地理解線程的應用,筆者通過一個案例來演示線程在網(wǎng)絡通信中的實際應用,該案例的整體流程如圖1-4所示。

圖1-4 線程在網(wǎng)絡通信中的實際應用

在BIO(阻塞I/O)模型中,服務端基于ServerSocket.accept()方法來接收客戶端的請求,當客戶端發(fā)起一次請求后,在等待服務端返回執(zhí)行結果前,ServerSocket無法處理其他請求。也就是說,服務端同一時刻只能處理一個請求,在多用戶訪問的系統(tǒng)中,這樣顯然會產(chǎn)生不好的用戶體驗。

如果使用多線程的方式來實現(xiàn),那么服務端可以針對每個請求,分配一個專門的線程去處理,然后服務端繼續(xù)接收下一個請求。通過這種方式的優(yōu)化可以大大提升服務端同時處理的客戶端請求數(shù)量,下文詳細介紹具體的實現(xiàn)。

1.5.1 ServerSocket

ServerSocket的代碼如下。

上述代碼的請求處理邏輯說明如下。

? ServerSocket定義了一個監(jiān)聽端口8080,當客戶端訪問8080時,服務端就會接收請求。

? Server端接收請求是采用accept()方法來實現(xiàn)的,當收到一個客戶端請求時,會返回一個Socket實例。

? 當Server端收到請求后,采用Thread異步執(zhí)行該請求,由于線程具有非阻塞性,因此可以快速進入第二次循環(huán),繼續(xù)監(jiān)聽客戶端請求。

1.5.2 SocketThread

SocketThread線程用來專門處理客戶端發(fā)送過來的請求,代碼如下。

在Tomcat 7中,針對請求的處理默認就是使用線程池改造后的BIO模式來實現(xiàn)的。在Zookeeper、Nacos、Dubbo等中間件中,也都大量采用了異步線程。

主站蜘蛛池模板: 平泉县| 河池市| 兴城市| 雷州市| 德化县| 昭觉县| 广河县| 河东区| 宜城市| 咸阳市| 富锦市| 肇东市| 章丘市| 左云县| 年辖:市辖区| 阳新县| 嵊泗县| 沁源县| 普格县| 西乌珠穆沁旗| 隆德县| 大理市| 徐水县| 洪江市| 正宁县| 闸北区| 永宁县| 轮台县| 平泉县| 阿尔山市| 江山市| 同江市| 泽普县| 左云县| 肥西县| 苍溪县| 湄潭县| 南乐县| 丹寨县| 通道| 攀枝花市|