Java執行緒的建立

2021-08-17 09:21:46 字數 2238 閱讀 3243

執行緒的定義

想知道什麼是執行緒先要知道什麼是程序,程序(process)是計算機中的程式關於某資料集合上的一次執行活動,這麼講不好理解,舉例來說就是,執行qq,就開啟了乙個程序,關閉qq就是關閉乙個程序,即是說,程序是乙個執行中的程式。程式未開啟時和檔案沒兩樣,開啟之後,就和處理器產生了關聯,成為了乙個活動的實體,稱之為程序。

但是,話鋒一轉,我們都知道,cpu只有乙個,多執行緒並不代表cpu同一時間服務於多個執行緒,而是各執行緒在排程演算法的作用下輪流占用cpu,即是說,單個執行緒並沒有一直占用cpu,即處於執行狀態,而是隔一段時間使用一會兒cpu,隔開的這段時間就是cpu給其他執行緒使用的時間。

執行緒的資料安全

執行緒的好處毋庸置疑,但存在乙個顯著的資料安全問題,舉個例子,兩個吃蘋果執行緒不停輪流吃一堆蘋果直到蘋果數變為0就停止,吃這個動作可分為兩步,判斷蘋果數是否大於0,如果大於0就吃掉乙個(把蘋果數字減一),否則就跳出迴圈。

大家認為最後儲存蘋果的值會變成多少呢?講道理肯定是0對不對,因為每次執行吃這個動作的條件都是蘋果數量大於0,如果某執行緒吃完了最後乙個蘋果,另乙個執行緒執行的時候會發現蘋果為0了,就會跳出迴圈,不會再繼續了,這邏輯可謂毫無瑕疵,是的毫無瑕疵,才怪了。

真實情況是你會發現即使是某乙個執行緒把蘋果數減為0之後,另乙個執行緒還是會執行把蘋果數量減一的操作,也就是說蘋果數很有可能最終不是0,而是-1這樣子。

為什麼呢?原因出在多執行緒機制裡面。這兩個吃蘋果執行緒都需要獲得cpu執行權才能執行自己的吃蘋果方法。但執行權就乙個,僧多肉少,僧和僧就是競爭關係了。執行緒和執行緒也是競爭關係,也正因為是競爭,你的競爭執行緒可不會等你完成整個吃蘋果的流程才來搶占cpu使用權。

要理解這個問題我們要從流程出發,給兩個執行緒取名a、b,用a為例回顧下吃蘋果流程:第一步、a檢查蘋果數量是否大於0,第二步、需要根據第一步判斷結果,來決定如何操作,如果第一步判斷得蘋果數大於0,a就把蘋果數字減一,否則什麼也不做。我們帶入乙個具體場景來看,假如還剩乙個蘋果,恰好a搶到了執行權,嘿嘿,美滋滋。a剛剛執行完第一步,b就把a擠走了,自己占用了執行權,並且順利的完成了判斷和吃蘋果的工作。此時變成蘋果數變成0,b執行緒結束,執行權回到a手中,此時a是從它停止的的地方開始執行的,也就是第二步,即a會將蘋果數再次減一,這時候就變成-1了。資料安全問題就出現了。

整理下思路,因為a判斷的時蘋果數是正常的,但是判斷完被b搶走執行權,使蘋果數變成0,b執行緒順利結束,但此時a還剩下第二步將蘋果數減一沒執行,會繼續執行,所以蘋果數就變成-1了,這可不是我們想要的結果。

執行緒安全問題就是這樣產生的,對於執行緒共享的資料來說,一些需要這些共享資料滿足一定條件才執行的**,在執行過程中,執行緒控制權被搶,而搶走控制權的執行緒改變了共享資料(即此例中的蘋果),待原執行緒重獲控制權,此時的共享資料因為被更改已經不滿足執行條件了,但是該執行緒依然是從上一次執行到的位置繼續執行(也就是滿足條件才會執行的方法體中的某個位置),繼而產生糟糕的後果。

執行緒建立的方式

常規來講,建立執行緒有兩種方式。

i.繼承thread類

第一步:自定義乙個類(筆者取名為mythread)繼承系統類thread

第二步:在自定義類中重寫thread類的run方法(執行緒的工作就是執行run方法)

第三步:呼叫預設建構函式建立乙個自定義類的例項,並呼叫該例項的start方法,該執行緒即開啟

源**:

ii.實現runnable

第一步:自定義乙個類(筆者取名為myinte***cethread)實現系統介面runnable

第二步:在自定義類中重寫runnable介面的run方法

第三步:呼叫myinte***cethread類的預設建構函式,建立乙個myinte***cethread例項 inte***cethread

第四步:呼叫帶參建構函式,建立乙個thread類的例項thread,引數就是第三步建立的 inte***cethread

第五步:呼叫thread的start方法,即執行緒開啟

源**:

Java 執行緒的建立

執行緒的建立有兩種方法。一種方法是建立thread類的子類,並在子類中重寫run方法。如下 thread類的子類 public class mythread extends thread 帶參構造方法 public mythread string name public void run publi...

Java 執行緒的建立方法

一多執行緒的概念 簡單說執行緒就是程式執行的不同路徑。而程序是乙個靜態的概念通常說的啟動乙個程序是啟動乙個程序裡面的主線程。多執行緒則是乙個程序裡面的不同的程式的執行路徑。而事實上在某乙個時刻cpu執行了某乙個程式 由於速度很快所以 我們感覺不出來 二線程的建立 1 實現介面建立 public vo...

Java多執行緒2 執行緒的建立

上一講中我們講了什麼是執行緒,這一講我們細細討論一下關於執行緒的那些事。先看看執行緒的狀態轉換圖。1.首先執行緒被建立出來。2.進入就緒佇列中等待cpu分配時間片 這裡的時間片指的是cpu允許執行緒執行的最大時間 若在規定時間內未執行完成,則執行緒繼續進入就緒佇列等待cpu分配時間片。3.執行緒進入...