1.新建狀態(New):
當用new操作符建立一個執行緒時, 例如:new Thread(),執行緒還沒有開始執行,此時執行緒處在新建狀態。當一個執行緒處於新生狀態時,程式還沒有開始執行執行緒中的程式碼
2.就緒狀態(Runnable)->可執行狀態
也被稱為“可執行狀態”。執行緒物件被建立後,其它執行緒呼叫了該物件的start()方法,從而來啟動該執行緒。例如,thread.start()。處於就緒狀態的執行緒,隨時可能被CPU排程執行。
3.執行狀態(Running)
當就緒狀態的執行緒被呼叫並獲得處理器資源時,執行緒就進入了執行狀態。此時,自動呼叫該執行緒物件的run()方法。
run()方法定義了該執行緒的操作和功能。執行狀態中的執行緒執行自己的run方法中程式碼。直到呼叫其他方法或者發生阻塞
而終止。
4.阻塞狀態(Blocked) ->不可執行狀態
阻塞狀態是執行緒因為某種原因放棄CPU使用權,暫時停止執行。直到執行緒進入就緒狀態,才有機會轉到執行狀態。阻塞的情況分三種:
(1) 等待阻塞 — 通過呼叫執行緒的wait()方法,讓執行緒等待某工作的完成。
(2) 同步阻塞 — 執行緒在獲取synchronized同步鎖失敗(因為鎖被其它執行緒所佔用),它會進入同步阻塞狀態。
(3) 其他阻塞 — 通過呼叫執行緒的sleep()或join()或發出了I/O請求時,執行緒會進入到阻塞狀態。當sleep()狀態超時、join()等待執行緒終止或者超時、或者I/O處理完畢時,執行緒重新轉入就緒狀態。
很多教成會將線程的狀態和Java中的方法調用聯繫起來 ,進而將阻塞狀態(Blocked)分拆成->
阻塞(BLOCKED):表執行緒阻塞於鎖。
等待(WAITING):進入該狀態的執行緒需要等待其他執行緒做出一些特定動作(通知或中斷)。
超時等待(TIME_WAITING):該狀態不同於WAITING,它可以在指定的時間內自行返回。
5.死亡狀態(Dead) ->結束狀態
執行緒執行完了或者因異常退出了run()方法,該執行緒結束生命週期。
新建狀態、就續狀態(可執行狀態實作)、執行狀態實例
package ThreadDemo;
class MyThread2 extends Thread{
int i = 0, x;
String name;
MyThread2(String name,int a){
int x = a;
this.name=name;
start();//在這邊 開始執行 執行續
}
@Override
public void run() {
try {
while(true) {
i++;
System.out.println(name+"執行第"+i+"次!");
sleep(x);//x 進入到非可執行狀態
if(i>=5) break;
}
}
catch(Exception e){
System.out.println("例外產生...!");
}
}
}
public class ThreadNewRunnableDemo {
public static void main(String[] args) {
Thread t1 = new MyThread2("執行續 t1",15);
Thread t2 = new MyThread2("執行續 t2",20);
}
}