天天看點

深入java多線程,認識多線程

1、什麼是多線程?

講到線程,不得不提到程序,而程序跟作業系統相關聯。一個程序對應的是一個運作中的應用程式,我們平時上的QQ、浏覽器都會有相對應的程序,程序是作業系統運作的基本機關,一個應用程式可能有多同時運作的程序。每個程序都有獨立的記憶體空間。在Windows系統中,一個運作的exe就是一個程序。

深入java多線程,認識多線程

程序示例

線程是程序的子集,一個程序包含很多線程,每條線程并行執行不同的任務。一條線程是程序内部的一個獨立執行單元,是程序中的一個實體,被系統獨立排程和分派的基本機關,線程自己不擁有系統資源。我們常說的多線程并發,不是真正的同時運作多個線程,并發是cpu通過cpu排程算法按一定次序執行多個線程,在使用感覺上是感覺不到的。并行才是真正上的同時處理同時運作。現在電腦一般都是多核,可以同時處理多個線程,處理速度加快很多。

運作普通java程式需要一條線程(gc線程除外)。當運作一個類時,jvm會在作業系統中啟動一個線程,cpu接受到線程執行任務時即開始執行,直至執行完畢。

每當使用 java 指令執行一個類時,實際上都會啟動一個 JVM,每一個 JVM 實際上就是在作業系統中啟動了一個線程,java 本身具備了垃圾的收集機制,是以在 Java 運作時至少會啟動兩個線程。由于建立線程的開銷比建立程序的開銷小的多,是以在開發多任務運作的時候,通常考慮建立多線程,而不是建立多程序。

早期java對多線程的支援很差,算是軟肋,可能早期的cpu都是單核為主,硬體性能不高,再加上早期高并發現象很少,不像現在普遍都存在高并發。自jdk1.5以來,java不斷在完善對多線程的支援,優化synchronized效率,引入java.util.concurrent包,新建立了很多并發接口和類。在大資料時代,大型小型公司都存在高并發現象,可以說是随處可見,随着時代的發展,高并發場景隻會越來越多,cpu處理速度隻會加快,java作為現如今主流的伺服器端開發語言,對多線程的支援必不可少,多線程也将成為開發語言的重中之重。

2、為什麼要用多線程,使用多線程好處有哪些?

多線程出現的原因:

為了充分利用cpu資源,為了提高cpu的使用率,采用多線程的方式去同時完成幾件事情而不互相幹擾。處理大量的IO操作時或處理的情況需要花費大量的時間等等。比如:讀寫檔案,視訊圖像的處理。現如今cpu處理能力相對來說比較高,大部分時間都會有空閑的cup資源,多線程可以合理使用空閑cpu資源,加快程式運作速度。

  1. 發揮多處理器的強大能力。
  2. 處理異步事件。多線程能一部分線程接收用戶端請求,一部分線程處理請求。單線程不能同時處理,阻塞接收請求或者處理請求。
  3. 響應更加靈敏的界面。
  4. 提高程式運作效率。

3、多線程使用場景

  • 日常接觸的jvm就是一個典型的多線程,一個線程運作java程式,同時另外線程運作gc,時時刻刻進行垃圾掃描回收
  • tomcat容器,一部分線程接收請求,同時另一部分線程處理請求
  • 下載下傳或者處理大檔案時,大檔案可以分成多個部分,每個線程處理一部分,很大程度加快了處理速度,縮短等待時間
  • 異步處理任務,例如:訂單業務處理完,異步發送其他通知或者推送。會員注冊完成送積分,送積分需遠端通路另外的積分系統,或者通路比較耗時,可以開辟新的線程來處理這樣的請求。(非保障性)
  • 備份、複制的操作,例如非常耗時的大檔案大資料的複制,備份資料庫,可以單獨開個線程進行處理。典型的比如mysql資料庫的主從複制,每次要主從同步時,mysql服務會在背景開啟新線程,同步binlog檔案。
  • 大資料處理,單線程處理大資料耗時多,可以把資料分成多份,多個線程處理。例如要校驗一萬條資料,單線程要花十分鐘,将一萬條資料分10份,開10個線程處理,每個線程處理一千條,隻需大概一分鐘。
  • 等等

4、多線程的不利之處

  • 多線程運作需要更多的運作記憶體
  • 多線程之間頻繁切換需耗費大量的cpu性能和時間,一般多線程都是按時間片來運作,時間片用完即切換下一個線程
  • 多線程容易産生死鎖、資料共享、資料一緻性等問題。使用多線程無疑直接的加大了開發人員的工作量和工作難度,多線程程式比單線程程式的設計要複雜的多,對開發人員的要求也更高。在多線程環境下,會出現各種無法預知的多線程問題,如果保證資料多線程問題也是一大難點,由此,java也新建立對多線程支援的包、類、關鍵字、鎖等。

5、多線程一定快嗎

答案當然是不一定,多線程之間切換需要消耗cpu大量性能,不是所有的場景都要使用多線程。

繼續閱讀