Java多線程的應用場景和應用目的舉例


01

通俗的解釋一下多線程

 

多線程用於堆積處理,就像一個大土堆,一個推土機很慢,那么10個推土機一起來處理,當然速度就快了,不過由於位置的限制,如果20個推土機,那么推土機之間會產生相互的避讓,相互摩擦,相互擁擠,反而不如10個處理的好,所以,多線程處理,線程數要開的恰當,就可以提高效率。

 

02

多線程使用的目的

 

1、吞吐量:做WEB,容器幫你做了多線程,但是它只能幫你做請求層面的,簡單的說,就是一個請求一個線程(如struts2,是多線程的,每個客戶端請求創建一個實例,保證線程安全),或多個請求一個線程,如果是單線程,那只能是處理一個用戶的請求。

 

2、伸縮性:通過增加CPU核數來提升性能。

 

03

多線程的使用場景

 

1、常見的瀏覽器、Web服務(現在寫的web是中間件幫你完成了線程的控制),web處理請求,各種專用服務器(如游戲服務器)。

 

2、servlet多線程。

 

3、FTP下載,多線程操作文件。

 

4、數據庫用到的多線程。

 

5、分布式計算。

 

6、tomcat,tomcat內部采用多線程,上百個客戶端訪問同一個WEB應用,tomcat接入后就是把后續的處理扔給一個新的線程來處理,這個新的線程最后調用我們的servlet程序,比如doGet或者dpPost方法。

 

7、后台任務:如定時向大量(100W以上)的用戶發送郵件;定期更新配置文件、任務調度(如quartz),一些監控用於定期信息采集。

 

8、自動作業處理:比如定期備份日志、定期備份數據庫。

 

9、異步處理:如發微博、記錄日志。

 

10、頁面異步處理:比如大批量數據的核對工作(有10萬個手機號碼,核對哪些是已有用戶)。

 

11、數據庫的數據分析(待分析的數據太多),數據遷移。

 

12、多步驟的任務處理,可根據步驟特征選用不同個數和特征的線程來協作處理,多任務的分割,由一個主線程分割給多個線程完成。

 

13、desktop應用開發,一個費時的計算開個線程,前台加個進度條顯示。

 

14、swing編程。

 

舉一個小栗子:

 

一個文本文件有100M,全是字符串,我要執行切分字符串,每達到N長度便執行切腹,最后求切分完成的字符串的集合。

 

04

單線程處理

 

讀取文本文件數據,掃描全部數據,一個一個的切分,最后消耗時間=文件傳輸時間(文本數據加載到內存)+切分過程消耗。

 

05

多線程處理

 

專門設置一個線程執行加載數據的操作,此時,如果加載的數據達到一個設定值,啟動一個切線程處理,如此繼續,多個切分字符串的線程能夠並發執行,CPU的利用率提高了(文件傳輸的過程中沒有占用處理器,而可以將加載的部分數據分配給切分線程,占用處理器來執行任務)。

 

總結:

 

單線程處理,文件加載的過程中,處理器一直空閑,但也被加入到總執行時間之內,串行執行切分總時間,等於每切分一個時間*切分后字符串的個數,執行程序,估計等幾分鍾能處理完就不錯了。

 

多線程處理,文件加載過程與拆分過程,拆分過程與拆分過程,都存在並發——文件加載的過程中就執行了切分任務,切分任務執行過程中多線程並行處理,總消耗時間能比單線程提高很多,甚至幾個數量級都不止。
---------------------
作者:Java面經
來源:CSDN
原文:https://blog.csdn.net/xiamiflying/article/details/80417532
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM