建立new,就緒runnable,運行running, 阻塞blocked,等待time waiting,時間等待waiting,消亡dead線程
建立:用戶建立一個線程對象
就緒:建立完線程不會當即進入就緒狀態,須要爲線程分配內存空間,等到知足全部就緒條件後,纔會進入就緒狀態。繼承
運行:進入就緒狀態後,須要等待獲取CPU執行時間,獲得CPU執行時間後,纔會進入運行狀態。內存
阻塞:運行過程當中,同步塊被阻塞的話會進入阻塞狀態同步
時間等待:運行過程當中,用戶主動讓線程睡眠的話,進入時間等待it
等待:運行過程當中,用戶讓線程等待的話,進入等待object
消亡:線程執行完畢或者忽然中斷,就會被消亡yield
對於單核CPU來講,CPU在一個時刻只能運行一個線程,在 運行一個線程的過程當中,轉去運行另外一個線程,就叫上下文切換。程序
上下文切換時,線程須要保存線程的運行狀態,以便下次切換回來的時候繼續切換以前的狀態運行。方法
在馮諾伊曼結構的計算機中,是由CPU的控制器執行指令,每執行一條指令,程序計數器記錄指令運行到哪,因此須要保存程序計數器和CPU寄存器的狀態。
上下文切換就是存儲和恢復CPU狀態的過程,它使得線程執行可以從中斷點恢復執行。
開啓一個線程
啓動線程後,線程得到了CPU執行時間,就會執行run中的代碼。
繼承Thread類,須要重寫run方法。
讓線程睡眠,線程進入時間等待的狀態。
交出CPU,CPU去執行其餘任務。 若是當前線程持有對象鎖,不會釋放鎖,至關於線程阻塞。
調用yield方法會讓當前線程交出CPU,不會交出鎖。
和sleep區別:
1.不能控制具體交出CPU的時間。yield會讓線程進入就緒狀態,只要得到CPU就能執行。sleep在等待時間內是阻塞的。 2.yield只能讓同等或更高優先度的線程得到CPU,sleep沒有限制。
主線程中,調用無參join,會讓主線程等待直到線程任務執行完畢。 調用有參join,就會等待一段時間。
本質是object.wait方法,會交出CPU, 釋放鎖
阻塞線程調用interrupt的話,會拋出異常來中斷阻塞線程。
本質是把中斷標誌設爲true。調用isInterrupted()就可以判斷中斷標記的狀態。
廢棄方法。