若是不考慮多線程的話,那麼在程序只有一條執行路徑,代碼串行執行:順序執行、選擇或者循環。單線程就像你用你慣常的手去寫字,多線程編程就要求你左手畫圓,右手畫方。一不留神就會手忙腳亂,圓不是圓,方也不像方。在繼續學習多線程編程以前,先來小小的回顧一下操做系統的進化史。web
手工操做:計算機並不包含操做系統,從頭至尾只執行一個程序,這個程序能夠訪問程序中全部的資源。數據庫
批處理系統:加載在計算機上的一個系統軟件,在它的控制下,計算機可以自動地、成批地處理一個或多個用戶的做業(這做業包括程序、數據和命令)。編程
多道程序設計技術: 所謂多道程序設計技術,就是指容許多個程序同時進入內存並運行。即同時把多個程序放入內存,並容許它們交替在CPU中運行,它們共享系統中的各類硬、軟件資源。當一道程序因I/O請求而暫停運行時,CPU便當即轉去運行另外一道程序。tomcat
分時系統: 因爲CPU速度不斷提升和採用分時技術,一臺計算機可同時鏈接多個用戶終端,而每一個用戶可在本身的終端上聯機使用計算機,好象本身獨佔機器同樣。安全
從操做系統的發展能夠看出來,從單任務到多任務,從多道處理到分時處理,計算機的資源利用率和併發性愈來愈高了。服務器
在早期的分時系統中,每一個進程至關於一臺虛擬的馮·諾依曼計算機,它擁有存儲指令和數據的內存空間,根據機器語言的語義以串行的方式執行指令,並經過一組I/O指令與外部設備通訊。多線程
這個時候若是把一個進程當作虛擬機,那麼這個進程中的線程就至關於虛擬機中的進程啦。併發
串行編程的好處在於直觀和簡單,不容易出岔子,缺點是若是某些步驟處理時間過長鬚要無謂的等待;異步
異步處理的好處是:高效,充分利用資源,缺點各個步驟之間須要協調一致,否則容易亂套。分佈式
結論:分時,多進程、多線程的併發、異步執行,這些複雜的編程手段已經成熟了,須要咱們更好地掌握以提升本身的編程水平。
1. 發揮處理器的強大能力
在多處理器上,多線程能夠經過提升處理器資源的利用率來提升系統的吞吐率。
在單處理器系統上也能夠得到更高的吞吐率,好比說多線程程序在等待某個同步I/O操做時,還有其餘線程能夠繼續運行。
2. 建模的簡單性
完成單任務時,很簡單,只要把這件事作好就行。可是在完成多任務的時候,不只要把活幹好,還要考慮不一樣任務之間存在優先級和時間。
3. 異步事件的簡化處理
一部分線程接受客戶端請求,另外一部分處理器請求。若是是單線程程序的話,處理請求時會停頓致使接受請求阻塞,爲了不這個問題單線程程序必須使用非阻塞的I/O,這種I/O的複雜性要遠遠高於同步I/O。
4. 響應靈敏的用戶界面
這個就不解釋了。
若是使用得當,線程能夠有效地下降程序的開發和維護成本,同時提高複雜應用程序的性能。
這裏列舉幾個多線程的應用場景,幫助加深理解。
1. 圖形用戶界面中,多線程能夠提供用戶界面響應靈敏度。
2. 服務器應用程序中,能夠提高資源利用率以及系統吞吐率。好比在tomcat中一部分線程接受請求,另外一部分線程處理請求。
3. JVM垃圾收集器中,垃圾收集一般在一個或者多個專門的線程中運行,同時還有個主線程來運行main方法。
4. 矩陣計算,多線程併發執行。
5. 下載大文件時,大文件能夠分紅多個部分,每一個線程下載一部分。
6. 多叉樹中搜索N個文件。
7. 假設有個請求,這個請求服務端的處理須要執行3個很緩慢的IO操做(好比數據庫查詢或文件查詢)。
8. web服務器自己;各類專用服務器(如遊戲服務器)。
9. 後臺任務,例如:定時向大量(100w以上)的用戶發送郵件。
10. 異步處理,例如:發微博、記錄日誌等。
11. 分佈式計算。
12. 生產者和消費者模型。
13. 定時任務。
14. Servlet和JSP,多併發時可能有多個客戶端請求Servlet,Servlet必須是線程安全的。
15. 遠程方法調用。