簡單的例子理解java線程的生命週期

線程的生命週期圖如下:

簡單的例子理解java線程的生命週期

線程生命週期

這些狀態在java.lang.Thread類中是以枚舉的形式定義的

public enum State {

/**至今尚未啓動的線程的狀態。*/

NEW,

/**可運行線程的線程狀態。處於可運行狀態的某一線程正在 Java 虛擬機中運行,但它可能正在等待操作系統中的其他資源,比如處理器。*/

RUNNABLE,

/**受阻塞並且正在等待監視器鎖的某一線程的線程狀態。處於受阻塞狀態的某一線程正在等待監視器鎖,以便進入一個同步的塊/方法,或者在調用Object.wait之後再次進入同步的塊/方法。*/

BLOCKED,

/**某一等待線程的線程狀態。某一線程因爲調用下列方法之一而處於等待狀態:

不帶超時值的 Object.wait
不帶超時值的 Thread.join
LockSupport.park
處於等待狀態的線程正等待另一個線程,以執行特定操作。 例如,已經在某一對象上調用了 Object.wait() 的線程正等待另一個線程,以便在該對象上調用 Object.notify() 或 Object.notifyAll()。已經調用了 Thread.join() 的線程正在等待指定線程終止。*/

WAITING,

/**具有指定等待時間的某一等待線程的線程狀態。某一線程因爲調用以下帶有指定正等待時間的方法之一而處於定時等待狀態:

Thread.sleep
帶有超時值的 Object.wait
帶有超時值的 Thread.join
LockSupport.parkNanos
LockSupport.parkUntil */
TIMED_WAITING,

/**已終止線程的線程狀態。線程已經結束執行。*/

TERMINATED;

}


以下代碼是一個簡單的小例子:

public class Main {

private static class Runner implements Runnable {

@Override

public void run() {

try {

System.out.println("sleep...");

Thread.sleep(10);

System.out.println("yield...");

Thread.yield();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

public static void main(String[] args) throws InterruptedException {

Thread t = new Thread(new Runner());

System.out.println(t.getState());

t.start();

System.out.println(t.getState());

while (t.isAlive()) {

System.out.println(t.getState());

}

System.out.println(t.getState());

}

}


輸出:

NEW

RUNNABLE

RUNNABLE

RUNNABLE

RUNNABLE

sleep...

BLOCKED

TIMED_WAITING

(此處省略八百多行的TIMED_WAITING)

TIMED_WAITING

yield...

BLOCKED

RUNNABLE

TERMINATED


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章