Android 基礎知識——執行緒

weixin_34128411發表於2018-06-06

執行緒

執行緒是一個程式內部的順序控制流。執行緒是一個程式裡面不同的執行路徑

通常在一個程式中可以包含若干個執行緒,當然一個程式中至少有一個執行緒,不然沒有存在的意義。執行緒可以利用程式所擁有的資源,在引入執行緒的作業系統中,通常都是把程式作為分配資源的基本單位,而把執行緒作為獨立執行和獨立排程的基本單位,由於執行緒比程式更小,基本上不擁有系統資源,故對它的排程所付出的開銷就會小得多,能更高效的提高系統多個程式間併發執行的程度。

程式(process

狹義定義:程式就是一段程式的執行過程。

廣義定義:程式是一個具有一定獨立功能的程式關於某個資料集合的一次執行活動。它是作業系統動態執行的基本單元,在傳統的作業系統中,程式既是基本的分配單元,也是基本的執行單元。

簡單的來講程式的概念主要有兩點第一,程式是一個實體。每一個程式都有它自己的地址空間,一般情況下,包括文字區域(text region)、資料區域(data region)和堆疊(stack region)。文字區域儲存處理器執行的程式碼;資料區域儲存變數和程式執行期間使用的動態分配的記憶體;堆疊區域儲存著活動過程呼叫的指令和本地變數。第二,程式是一個“執行中的程式”。程式是一個沒有生命的實體,只有處理器賦予程式生命時,它才能成為一個活動的實體,我們稱其為程式。

程式狀態:程式有三個狀態,就緒、執行和阻塞。就緒狀態其實就是獲取了出cpu外的所有資源,只要處理器分配資源就可以馬上執行。就緒狀態有排隊序列什麼的,排隊原則不再贅述。執行態就是獲得了處理器分配的資源,程式開始執行。阻塞態,當程式條件不夠時候,需要等待條件滿足時候才能執行,如等待i/o操作時候,此刻的狀態就叫阻塞態

多執行緒

在一個程式中,這些獨立執行的程式片段叫作“執行緒”(Thread),利用它程式設計的概念就叫作“多執行緒處理”。多執行緒是為了同步完成多項任務,不是為了提高執行效率,而是為了提高資源使用效率來提高系統的效率。執行緒是在同一時間需要完成多項任務的時候實現的。

最簡單的比喻多執行緒就像火車的每一節車廂,而程式則是火車。車廂離開火車是無法跑動的,同理火車也不可能只有一節車廂。多執行緒的出現就是為了提高效率。

執行緒和程式的區別:

定義方面:程式是程式在某個資料集合上的一次執行活動;執行緒是程式中的一個執行路徑。(程式可以建立多個執行緒)

角色方面:在支援執行緒機制的系統中,程式是系統資源分配的單位,執行緒是CPU排程的單位。

資源共享方面:程式之間不能共享資源,而執行緒共享所在程式的地址空間和其它資源。同時執行緒還有自己的棧和棧指標,程式計數器等暫存器。

獨立性方面:程式有自己獨立的地址空間,而執行緒沒有,執行緒必須依賴於程式而存在。

開銷方面。程式切換的開銷較大。執行緒相對較小。(前面也提到過,引入執行緒也出於了開銷的考慮。)

(1)程式是資源的分配和排程的一個獨立單元,而執行緒是CPU排程的基本單元

          (2)同一個程式中可以包括多個執行緒,並且執行緒共享整個程式的資源(暫存器、堆疊、上下文),一個進行至少包括一個執行緒。

          (3)程式的建立呼叫fork或者vfork,而執行緒的建立呼叫pthread_create,程式結束後它擁有的所有執行緒都將銷燬,而執行緒的結束不會影響同個程式中的其他執行緒的結束

          (4)執行緒是輕兩級的程式,它的建立和銷燬所需要的時間比程式小很多,所有作業系統中的執行功能都是建立執行緒去完成的

          (5)執行緒中執行時一般都要進行同步和互斥,因為他們共享同一程式的所有資源

          (6)執行緒有自己的私有屬性TCB,執行緒id,暫存器、硬體上下文,而程式也有自己的私有屬性程式控制塊PCB,這些私有屬性是不被共享的,用來標示一個程式或一個執行緒的標誌

程式:程式是一個靜態的概念

執行緒:一個程式裡面有一個主執行緒叫main()方法,是一個程式裡面的,一個程式裡面不同的執行路徑。

在同一個時間點上,一個CPU只能支援一個執行緒在執行。因為CPU執行的速度很快,因此我們看起來的感覺就像是多執行緒一樣。

程式與執行緒的選擇取決以下幾點:

1、需要頻繁建立銷燬的優先使用執行緒;因為對程式來說建立和銷燬一個程式代價是很大的。2、執行緒的切換速度快,所以在需要大量計算,切換頻繁時用執行緒,還有耗時的操作使用執行緒可提高應用程式的響應3、因為對CPU系統的效率使用上執行緒更佔優,所以可能要發展到多機分佈的用程式,多核分佈用執行緒;4、並行操作時使用執行緒,如C/S架構的伺服器端併發執行緒響應使用者的請求;5、需要更穩定安全時,適合選擇程式;需要速度時,選擇執行緒更好。

在java.lang.Thread類中,提供了sleep(),

而java.lang.Object類中提供了wait(), notify()和notifyAll()方法來操作執行緒

sleep()可以將一個執行緒睡眠,引數可以指定一個時間。

而wait()可以將一個執行緒掛起,直到超時或者該執行緒被喚醒。

    wait有兩種形式wait()和wait(milliseconds).

sleep和wait的區別有:

  1,這兩個方法來自不同的類分別是Thread和Object

  2,最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他執行緒可以使用同步控制塊或者方法。

  3,wait,notify和notifyAll只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在

    任何地方使用

   synchronized(x){

      x.notify()

     //或者wait()

   }

   4,sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常

使用實現Runnable介面和繼承Thread類這兩種開闢新執行緒的方法的選擇應該優先選擇實現Runnable介面這種方式去開闢一個新的執行緒。因為介面的實現可以實現多個,而類的繼承只能是單繼承。因此在開闢新執行緒時能夠使用Runnable介面就儘量不要使用從Thread類繼承的方式來開闢新的執行緒。


5000859-7eeb25a8951a250c.png
5000859-5725d9837a0578e3.png


5000859-001db10f02b6c91c.png

相關文章