【轉載】Java多線程的好處

1. 充分利用CPU資源    

        現在世界上大多數計算機只有一塊CPU.因此,充分利用CPU資源顯得尤爲重要。當執行單線程程序時,由於在程序發生阻塞時CPU可能會處於空閒狀態。這將造成大量的計算資源的浪費。而在程序中使用多線程可以在某一個線程處於休眠或阻塞時,而CPU又恰好處於空閒狀態時來運行其他的線程。這樣CPU就很難有空閒的時候。因此,CPU資源就得到了充分地利用。   

2. 簡化編程模型    

       如果程序只完成一項任務,那隻要寫一個單線程的程序,並且按着執行這個任務的步驟編寫代碼即可。但要完成多項任務,如果還使用單線程的話,那就得在程序中判斷每項任務是否應該執行以及什麼時候執行。如顯示一個時鐘的時、分、秒三個指針。使用單線程就得在循環中逐一判斷這三個指針的轉動時間和角度。如果使用三個線程分另來處理這三個指針的顯示,那麼對於每個線程來說就是指行一個單獨的任務。這樣有助於開發人員對程序的理解和維護。   

3. 簡化異步事件的處理    

        當一個服務器應用程序在接收不同的客戶端連接時最簡單地處理方法就是爲每一個客戶端連接建立一個線程。然後監聽線程仍然負責監聽來自客戶端的請求。如果這種應用程序採用單線程來處理,當監聽線程接收到一個客戶端請求後,開始讀取客戶端發來的數據,在讀完數據後,read方法處於阻塞狀態,也就是說,這個線程將無法再監聽客戶端請求了。而要想在單線程中處理多個客戶端請求,就必須使用非阻塞的Socket連接和異步I/O.但使用異步I/O方式比使用同步I/O更難以控制,也更容易出錯。因此,使用多線程和同步I/O可以更容易地處理類似於多請求的異步事件。   

4. 使GUI更有效率    

        使用單線程來處理GUI事件時,必須使用循環來對隨時可能發生的GUI事件進行掃描,在循環內部除了掃描GUI事件外,還得來執行其他的程序代碼。如果這些代碼太長,那麼GUI事件就會被“凍結”,直到這些代碼被執行完爲止。在現代的GUI框架(如SWING、AWT和SWT)中都使用了一個單獨的事件分派線程(event dispatch thread,EDT)來對GUI事件進行掃描。當我們按下一個按鈕時,按鈕的單擊事件函數會在這個事件分派線程中被調用。由於EDT的任務只是對GUI事件進行掃描,因此,這種方式對事件的反映是非常快的。   

5. 節約成本    

   提高程序的執行效率一般有三種方法:    
  (1)增加計算機的CPU個數。    
  (2)爲一個程序啓動多個進程    
  (3)在程序中使用多進程。    

         第一種方法是最容易做到的,但同時也是最昂貴的。這種方法不需要修改程序,從理論上說,任何程序都可以使用這種方法來提高執行效率。第二種方法雖然不用購買新的硬件,但這種方式不容易共享數據,如果這個程序要完成的任務需要必須要共享數據的話,這種方式就不太方便,而且啓動多個線程會消耗大量的系統資源。第三種方法恰好彌補了第一種方法的缺點,而又繼承了它們的優點。也就是說,既不需要購買CPU,也不會因爲啓太多的線程而佔用大量的系統資源(在默認情況下,一個線程所佔的內存空間要遠比一個進程所佔的內存空間小得多),並且多線程可以模擬多塊CPU的運行方式,因此,使用多線程是提高程序執行效率的最廉價的方式。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章