多執行緒學習筆記 一

2021-04-17 00:18:10 字數 3340 閱讀 1742

繼承thread類來封裝要同步內容

class testthread extends thread

// 實現runnable來實現並封裝要同步內容

class testrunnable implements runnable 

public class startrunnable

//中斷執行緒new testthread().iterrupt();

如果乙個執行緒被阻塞了,它就無法檢查中斷狀態了。這就是產生iterruptedexception異常的地方。當在乙個被阻塞的執行緒上呼叫interrupt方法時,阻塞呼叫(例如sleep或者wait)就會被 interruptedexception異常所終止。中斷執行緒不一定要終止執行緒,不同的執行緒對中斷有不同的處理方法。

interrupted()方法和isinterrupted()的比較:

interrupted()方法:測試當前執行緒是否已經中斷。執行緒的中斷狀態 由該方法清除。換句話說,如果連續兩次呼叫該方法,則第二次呼叫將返回 false。

isinterrupted()方法:測試執行緒是否已經中斷。執行緒的中斷狀態 不受該方法的影響。

1.3 執行緒狀態

new:新生

runnable:可執行

blocked:被阻塞

dead:死亡

1.3.1 新生狀態         

new thread();

1.3.2 可執行執行緒          new thread().start();    

這個狀態執行緒不一定時在執行的,也可以處於不執行狀態,因為這是有作業系統來安排這個執行時間。記住,這個使runnable,而不是running!!!         

搶占式排程:系統給每個可執行的執行緒乙個時間片來處理任務。當這個時間片用完時,作業系統剝奪該執行緒對資源的占用,使其他執行緒有機會執行。現代作業系統都使用這個排程機制。

1.3.3 被阻塞執行緒         

當發生一下任何一種情況時,執行緒就進入被阻塞狀態:         

1)呼叫 sleep方法         

2)執行緒呼叫乙個在i/o上被阻塞的操作,即這個i/o操作結束之前不會返回到它的呼叫著         

3)執行緒試圖獲得鎖,而這個鎖被其他執行緒占有         

當乙個執行緒被阻塞時候,另乙個執行緒就可以被排程執行了。當乙個被阻塞執行緒重新被啟用時,排程起檢查它的優先順序有沒有比當前正在執行的執行緒優先順序高不高,假如高,它就將搶占當前執行緒的資源,並開始執行。          

通過一下方式執行緒可以從被阻塞狀態回到可執行狀態。        

1)sleep的毫秒數已過時        

2)執行緒正在等待的i/o操作已經完成時        

3)執行緒正在等待另乙個現成所持有的鎖,且另乙個執行緒已經釋放該鎖        

4)執行緒正在等待某個出發條件,且另乙個執行緒發出了訊號表明條件已經發生了變化。被超時時候也 包括       

5)執行緒已被掛起,且有人呼叫它的resume方法。但這個已經被棄用  

1.3.4 死執行緒      導致死執行緒的原因如下:     

1)run方法正常退出     

2)因為乙個未捕獲的異常中止了run方法而使執行緒死亡      

isaalive方法:     

測試執行緒是否處於活動狀態(要麼是可執行的,要麼是被阻塞的)。如果執行緒已經啟動且尚未終止,則為活動狀態。     

join(long millis)方法:     

等待該執行緒終止的時間最長為 millis 毫秒。超時為 0 意味著要一直等下去。

1.4 執行緒優先順序    

執行緒級別:    

thread.min_priority : 1    

thread.max_priority : 10    

thread.norm_priority :5         

public final void setpriority(int newpriority)方法:    

更改執行緒的優先順序。     

public final int getpriority()方法:   

返回執行緒的優先順序。       

public static void yield()方法:  

暫停當前正在執行的執行緒物件,並執行其他執行緒。

1.4.2 守護執行緒(後台執行緒)       

public final void setdaemon(boolean on)方法:       

setdeamon(true);設定為守護執行緒

1.4.3 執行緒組         

threadgroup g = new threadgroup(groupname);//groupname是唯一的。         

thread t = new thread(g , threadname);          

public int activecount()方法:         

返回此執行緒組中活動執行緒的估計數。                   

public final void interrupt()方法:        

中斷此執行緒組中的所有執行緒。        

new thread().getthreadgroup()方法:        

返回該執行緒所屬的執行緒組。 如果該執行緒已經終止(停止執行),該方法則返回 null。

1.5  同步 

1.5.3 鎖物件     

jdk5.0引進的reentrantlock類      

public void lock()方法:     

獲取鎖。     

public void unlock()方法:     

試圖釋放此鎖。1.5.4  條件物件     

condition c = new reentrantlock().newcondition();     

c.await();/

/造成當前執行緒在接到訊號或被中斷之前一直處於等待狀態。      

c.signalall();

//喚醒所有等待執行緒。       

當乙個執行緒呼叫了await時,它無法自己解除阻塞狀態。它把自己的命運交給了其他執行緒。如果沒有任何其他的執行緒來接觸等待執行緒的阻塞狀態,它就永遠也不會執行了,這會導致死鎖。    那麼應該什麼時候呼叫signalaall呢?例如,當乙個賬戶餘額發生變化時,等待執行緒應該有機會去檢查餘額。這樣使正在因為餘額不足而被阻塞的執行緒去嘗試一下條件滿不滿足。    signalall的呼叫不會立即啟用等待執行緒。它只是解除等待執行緒的阻塞狀態,這樣這些執行緒就可以在當前執行緒退出同步方法後,通過競爭獲得對物件的訪問。

多執行緒程式設計學習筆記(一)

多執行緒程式設計筆記 一 操作執行緒 1 操作例項 using system using system.threading 執行threadmethod的執行緒的 為 2 主線程結束 在threadmethod中,啟動子執行緒後,主線程休眠0.5等待子執行緒執行,子執行緒執行threadmethod...

JAVA 多執行緒學習筆記(一)

程序 當你點開乙個qq.exe的時候是乙個程序,點開wechat.exe的時候又是另外的乙個程序。執行緒 當你點開qq.exe的時候,qq這個程式裡面又有許多同時在執行的執行緒。建立多執行緒有3種方式,分別是繼承執行緒類,實現runnable介面,匿名類 第一種實現runnable介面 重寫run方...

多執行緒學習筆記 執行緒

thread類 常用屬性 currentthread 獲取當前正在執行的執行緒 isalive 指示當前執行緒的執行狀態 isbackground 指示是否為後台執行緒 isthreadpoolthread 指示是否屬於託管執行緒池 managedthreadid 獲取執行緒識別符號 name 獲取...