Thread類的使用

1.線程的狀態

建立new,就緒runnable,運行running, 阻塞blocked,等待time waiting,時間等待waiting,消亡dead線程

建立:用戶建立一個線程對象

就緒:建立完線程不會當即進入就緒狀態,須要爲線程分配內存空間,等到知足全部就緒條件後,纔會進入就緒狀態。繼承

運行:進入就緒狀態後,須要等待獲取CPU執行時間,獲得CPU執行時間後,纔會進入運行狀態。內存

阻塞:運行過程當中,同步塊被阻塞的話會進入阻塞狀態同步

時間等待:運行過程當中,用戶主動讓線程睡眠的話,進入時間等待it

等待:運行過程當中,用戶讓線程等待的話,進入等待object

消亡:線程執行完畢或者忽然中斷,就會被消亡yield

2.上下文切換

對於單核CPU來講,CPU在一個時刻只能運行一個線程,在 運行一個線程的過程當中,轉去運行另外一個線程,就叫上下文切換。程序

上下文切換時,線程須要保存線程的運行狀態,以便下次切換回來的時候繼續切換以前的狀態運行。方法

在馮諾伊曼結構的計算機中,是由CPU的控制器執行指令,每執行一條指令,程序計數器記錄指令運行到哪,因此須要保存程序計數器和CPU寄存器的狀態。

上下文切換就是存儲和恢復CPU狀態的過程,它使得線程執行可以從中斷點恢復執行。

3.Thread類中的方法

start

開啓一個線程

run

啓動線程後,線程得到了CPU執行時間,就會執行run中的代碼。

繼承Thread類,須要重寫run方法。

sleep

讓線程睡眠,線程進入時間等待的狀態。

交出CPU,CPU去執行其餘任務。 若是當前線程持有對象鎖,不會釋放鎖,至關於線程阻塞。

yield

調用yield方法會讓當前線程交出CPU,不會交出鎖。

和sleep區別:

1.不能控制具體交出CPU的時間。yield會讓線程進入就緒狀態,只要得到CPU就能執行。sleep在等待時間內是阻塞的。 2.yield只能讓同等或更高優先度的線程得到CPU,sleep沒有限制。

join

主線程中,調用無參join,會讓主線程等待直到線程任務執行完畢。 調用有參join,就會等待一段時間。

本質是object.wait方法,會交出CPU, 釋放鎖

interrupt

阻塞線程調用interrupt的話,會拋出異常來中斷阻塞線程。

本質是把中斷標誌設爲true。調用isInterrupted()就可以判斷中斷標記的狀態。

stop,destory

廢棄方法。

相關文章
相關標籤/搜索