第十三章 多執行緒 第二講

2021-08-31 17:29:46 字數 2565 閱讀 6605

二 執行緒的生命週期

執行緒是乙個動態執行的過程,它也有乙個從產生到死亡的過程,這就是所謂的生命週期。

生命週期的執行過程:

新建——》就緒——》執行——》死亡

1.生命週期的舉例與分析

(1)新建(new thread)

當建立thread類的乙個例項(物件)時,此執行緒進入新建狀態(未被啟動)。

例如:thread t1=new thread();

(2)就緒(runnable)

執行緒已經被啟動,正在等待被分配給cpu時間片,也就是說此時執行緒正在就緒佇列中排隊等候得到cpu資源。例如:t1.start();

(3)執行(running)

執行緒獲得cpu資源正在執行任務(run()方法),此時除非此執行緒自動放棄cpu資源或者有優先順序更高的執行緒進入,執行緒將一直執行到結束。

(4)死亡(dead)

當執行緒執行完畢或被其它執行緒殺死,執行緒就進入死亡狀態,這時執行緒不可能再進入就緒狀態等待執行。

自然終止:正常執行run()方法後終止

異常終止:呼叫stop()方法讓乙個執行緒終止執行

(5)堵塞(blocked)

由於某種原因導致正在執行的執行緒讓出cpu並暫停自己的執行,即進入堵塞狀態。

(1)正在睡眠:用sleep(long t) 方法可使執行緒進入睡眠方式。乙個睡眠著的執行緒在指定的時間過去可進入就緒狀態。

(2)正在等待:呼叫wait()方法。(呼叫motify()方法回到就緒狀態)

被另乙個執行緒所阻塞:呼叫suspend()方法。(呼叫resume()方法恢復)

2.執行緒的優先順序

把執行緒從就緒狀態進入執行狀態的過程叫做執行緒排程。負責排程工作的機構叫做排程管理器

優先順序:執行緒的優先順序的取值範圍是1~10,1的優先順序最高,預設的優先順序是5。

public static final int max_priority = 10

public static final int norm_priority = 5

public static final int min_priority = 1

`` 獲取優先順序的方法:public final int getpriority();

設定優先順序的方法:public final void setpriority(int newpriority);

優先順序的建立:mythread mt = new mythread(「thread」,8);

注:「thread」是執行緒的名字,8 是優先順序的設定

注:如果有多個執行緒在等待,並不是優先級別高的就肯定越早執行,只是獲得的機會更對一些,因此在通常情況下,不要依靠執行緒優先順序來控制線程的狀態.

(1)void run() //建立該類的子類時必須實現的方法

(2)void start() //開啟執行緒的方法

(3)static void sleep(long t) //釋放cpu的執行權,不釋放鎖

(4)static void sleep(long millis,int nanos) //(秒數,納秒數)

(5)final void wait()//釋放cpu的執行權,釋放鎖

(6)final void notify()//它與wait()一起使用

(7)static void yield()------暫停執行緒

yield()方法可以對當前執行緒進行臨時暫停(讓執行緒將資源釋放出來),允許其它執行緒的執行。該執行緒仍處於可執行的狀態,不轉變為阻塞狀態,它的優點是:保證有工作時不會讓cpu閒置,主要用於編寫多個合作執行緒,也適用於強制性執行緒間的合作。

注:在使用此方法時,設定為真或者假,是否可執行,**顯示:

if(flag)

}//堆疊的彈出

public charpop()

@override

public voidrun()

s.push('c');}}

//執行緒類runner2中的run()方法從堆疊中彈出棧頂字元。

public classrunner2implementsrunnable

@override

public voidrun()

//測試類

public classtestcritical

}2. 同步好處:決了執行緒安全問題

同步弊端:

降低了執行效率(判斷鎖是較為消耗資源的)

同步巢狀,容易出現死鎖

死鎖

兩個執行緒a、b用到同乙個物件s(s為共享資源),且執行緒a在執行中要用到b執行後所創造的條件。在這種前提下a先開始執行,進入同步塊後,物件s被鎖定,接著執行緒a因等待b執行結束而進入阻塞狀態,於是b開始執行,但因無法訪問物件s,執行緒b也進入阻塞狀態,等待s被執行緒a解鎖。最終的結果:兩個執行緒互相等待,都無法執行。

第十三章 多執行緒 第三講

第十三章 多執行緒 第三講 五 執行緒排程的方法詳解 sleep 方法是使當前執行緒睡眠指定的毫秒數,執行緒由進行狀態進入不可執行狀態,當指定的毫秒數過去後,如果有正在進行的執行緒,則進入就緒狀態,如果沒有正在進行的執行緒,則繼續執行。釋放cpu的執行權,不釋放鎖。yield 方法是使當前的執行緒暫...

技術部落格 第十三章 多執行緒

技術部落格 第十三章多執行緒 併發 1 巨集觀上 併發和並行相似,多工 2 微觀上 乙個cpu在做一件事,並沒有實現並行,單任務 並行 在os中 程序 資源分配的最小單位,執行緒 cpu排程的最小單位 執行緒是程序的一部分!多執行緒的實現 1 繼承thread方法 本身就是實現runable介面的類...

第十三章 併發

13.1 動機 13.2 基本執行緒 如果必須要控制現成的執行順序,最好是根本不用執行緒,而是自己編寫特定順序彼此控制的協作子程式。繼承thread類或者實現runnable介面。內部類實現。13.3 共享受限資源 1 如果要對類中的某個方法進行同步控制,最好同步所有方法。如果忽略了其中乙個,通常很...