1. 程式人生 > >java多執行緒:1程序和執行緒

java多執行緒:1程序和執行緒

多執行緒樣例

我們用工人卸貨舉例:有一集裝箱的貨物等待卸車,共100個箱子,一個工人一次只能搬一個箱子。

  1. 如果只有一個工人,那麼該工人需要搬運100次,而且是不停歇的搬運。
  2. 如果有5個或者10個工人,那麼平均每個工人只需要搬運20或者10次就可以了。
  3. 甚至有100個工人,那麼貨物可以立刻被立刻搬空。
    從上面的例子中,我們可以看出,如果想盡快的搬運貨物,最簡單的辦法就是增加搬運工人。

執行緒與程序的區別:

(1) 程序:一個具有獨立執行環境的單元,擁有基本的、私有的執行環境和資源,尤其是記憶體空間。重點在系統排程和單獨的單位。
 一個程序可以看做我們電腦上執行的一個程式或者應用程式,例如你的chorm瀏覽器可以看做一個程序。
(2) 執行緒:輕量型的程序,是CPU排程和分派的基本單位,比程序更小的能獨立執行的基本單位,執行緒自己基本上不擁有系統資源,
(3) 上述的搬運集裝箱就可以看做一個執行緒和程序,搬運工人是執行緒,而搬運貨物可以看做是程序。
因此在多個執行緒訪問記憶體資源(共同物件、資源)的時候,需要特殊處理。在執行時,只是暫用一些計數器、暫存器和棧 。  

程序和執行緒的關係

1、一個執行緒只能屬於一個程序,而一個程序可以有多個執行緒,但至少有一個執行緒(通常說的主執行緒)。
2、資源分配給程序,同一程序的所有執行緒共享該程序的所有資源,因此當程序中的一個執行緒出現OOM,那麼這個程序的所有執行緒都結束執行。
3、執行緒在執行過程中,需要協作同步。不同程序的執行緒間要利用訊息通訊的辦法實現同步。
4、處理機分給執行緒,即真正在處理機上執行的是執行緒。
5、執行緒是指程序內的一個執行單元,也是程序內的可排程實體。  

從三個角度來剖析二者之間的區別
1、排程:執行緒作為排程和分配的基本單位(由cpu進行排程),程序作為擁有資源的基本單位(由系統進行排程)。
2、併發性:不僅程序之間可以併發執行,同一個程序的多個執行緒之間也可以併發執行。
3、擁有資源:程序是擁有資源的一個獨立單位,執行緒不擁有系統資源,但可以訪問隸屬於該程序的資源。

為什麼使用多執行緒

  1. 利用多核CPU
    現在的cpu都是多核,如果只有一個執行緒的話,那麼該執行緒只能執行在單一cpu上,那麼就造成了浪費。因此通過執行在不同cpu上的執行緒,提高效率。
    說明:以前作業系統中學的單核的多執行緒實現,其實是偽多執行緒,實際在執行的只是一個執行緒,通過cpu的時間片劃分,切換執行緒執行,實現看起來是多個執行緒執行。但是因為只有一個cpu,同一時刻只有一個執行緒執行。
    cpu的多核同樣帶來一個問題,這也算是多執行緒帶來的問題:執行緒的通訊、公共資源的訪問。

  2. 解決單核cpu的阻塞,這個主要是單核cpu時,如果只有一個執行緒,那麼當該執行緒因為網路問題,或者其他原因。

  3. 便於建模
    這是另外一個沒有這麼明顯的優點了。假設有一個大的任務A,單執行緒程式設計,那麼就要考慮很多,建立整個程式模型比較麻煩。但是如果把這個大的任務A分解成幾個小任務,任務B、任務C、任務D,分別建立程式模型,並通過多執行緒分別執行這幾個任務,那就簡單很多了。

總結

多執行緒的最直接的意義就是:

  1. 最大程度的利用多核cpu。因為cpu排程的底層是執行緒,因此如果是4核cpu,那麼只有一個執行緒的話,那麼永遠有3個cpu是浪費的。
  2. 讓cpu做更有意義的工作,這個後續講。