1. 程式人生 > >多執行緒不是為了提高效率,而是不必等待

多執行緒不是為了提高效率,而是不必等待

併發和並行的區別就是一個處理器同時處理多個任務和多個處理器或者是多核的處理器同時處理多個不同的任務。

前者是邏輯上的同時發生(simultaneous),而後者是物理上的同時發生.
來個比喻:併發和並行的區別就是一個人同時吃三個饅頭和三個人同時吃三個饅頭。


並行”是指無論從微觀還是巨集觀,二者都是一起執行的,就好像兩個人各拿一把鐵杴在挖坑,一小時後,每人一個大坑。  而“併發”在微觀上不是同時執行的,只是把時間分成若干段,使多個程序快速交替的執行,從巨集觀外來看,好像是這些程序都在執行,這就好像兩個人用同一把鐵杴,輪流挖坑,一小時後,兩個人各挖一個小一點的坑,要想挖兩個大一點得坑,一定會用兩個小時。  從以上本質不難看出,“併發”執行,在多個程序存在資源衝突時,並沒有從根本提高執行效率。多執行緒執行時,幾個程式輪流執行,就像同時執行一樣。

單CPU單核、純計算、沒IO的理想狀態下,單個執行緒肯定比多個執行緒快,因為省去了執行緒切換的開銷。但真實的環境基本都有IO操作,在 非同步的業務場景下,我一般會使用執行緒池,至於執行緒池的執行緒數目配置為多少,有資料推薦為N×(1+IO耗時/完整的業務耗時),N是CPU核數。多執行緒並不是為了提高效率,而是不必等待 可以並行執行多條資料。 

  1. 多執行緒:   
  2.     執行緒是程序中的一個控制單元。   
  3.     一個程序至少有一個執行緒,為了提高效率,可以在一個程序中開啟多個控制單元。   
  4.     併發執行。如:多執行緒下載軟體。   
  5.     可以完成同時執行,但是通過程式執行的結果發現,雖然同時執行,但是每一次結果都不一致。   
  6.     因為多執行緒存在一個特性:隨機性。   
  7.     造成的原因:CPU在瞬間不斷切換去處理各個執行緒導致的。   
  8.     可以理解成多個執行緒在搶cpu資源。   
  9.     如果在程式中建立一個新的控制單元呢?   
  10.     Java對執行緒有自己描述,而且在呼叫系統資源。   
  11.     該描述的類是Thread。只要建立Thread類的物件即可在記憶體中建立新的控制單元。   
  12.     但是建立執行緒的目的是為了執行自定義的程式碼。   
  13.     自定義的程式碼如何和多執行緒相結合呢?   
  14.     通過start方法明確,執行緒是在執行run方法。   
  15.     那麼只要將執行緒需要執行的程式碼存入到run方法中即可。   
  16.     只要繼承Thread類並複寫該run方法即可。   
  17.     建立執行緒的第一種方式:繼承Thread類;   
  18. 1,定義Thread類的子類。建立子類物件,就是在記憶體中建立了控制單元。   
  19. 2,複寫Thread類中的run方法。將多執行緒要執行的程式碼存入其中。   
  20. 3,呼叫執行緒Thread中的start方法開啟執行緒,並讓jvm執行run方法。   
  21.     執行緒的四種狀態:   
  22. 1,被建立.new Thread類或者Thread類的子類物件。   
  23. 2,通過start方法,讓執行緒進入到了執行狀態。   
  24. 3,執行緒存活的情況,可以不執行,因為到了凍結狀態。   
  25. 4,消亡,執行緒執行的程式碼結束。   
  26.     如何獲取當前執行緒物件呢?   
  27.     通過Thread類中的靜態方法:Thread currentThread()。   
  28.     獲取執行緒的名稱 getName():預設是Thread-編號。   
  29.     什麼時候需要多執行緒呢?   
  30.     當多部分程式碼需要同時執行時,就需要使用多執行緒技術。   
  31.     聊天軟體的例子。傳送區域和接收資料區域就是同時執行的。
  32. 兩種建立方式:   
  33. 1,繼承Thread類。複寫run方法,通過start方法開啟執行緒。並讓jvm呼叫run方法。   
  34. 2,實現Runnable介面;   
  35. 2.1定義類實現Runnable介面。   
  36. 2.2複寫介面中run方法。   
  37. 2.3通過Thread類建立執行緒物件。   
  38. 2.4將實現了Runnable介面的子類物件作為引數傳遞給Thread類的建構函式。   
  39.             目的:讓執行緒可以執行執行的介面子類的run方法。   
  40. 2.5呼叫Thread類的start方法開啟執行緒。   
  41.     這兩種方式區別:   
  42.     執行緒程式碼存放的位置不同,一個存放在Thread類的子類中。一個存在Runnable介面的子類中。   
  43.     第二種方式有什麼好處呢?   
  44. 1,將資源對多執行緒共享。   
  45. 2,避免了單繼承的侷限性。  
  46. 轉載:http://blog.chinaunix.net/uid-26602509-id-3134808.html