一個線程創(chuàng)建之后,總是處于其生命周期的4個狀態(tài)之一中。線程的狀態(tài)表明此線 程當前正在進行的活動,而線程的狀態(tài)是可以通過程序來進行控制的,就是說,可以對線程進行操作來改變狀態(tài)。這些操作包括啟動(start)、終止(stop)、睡眠(sleep)、掛起 (suspend)、恢復(resume)、等待(wait)和通知(notify)。每一個操作都對應了一個方法,這些方法是由java.lang提供的。
線程狀態(tài)在Java中是通過一個Thread的內部枚舉State標識的。
Java代碼
public enum State {
/**
* Thread state for a thread which has not yet started.
*/
NEW,
/**
* Thread state for a runnable thread. A thread in the runnable
* state is executing in the Java virtual machine but it may
* be waiting for other resources from the operating system
* such as processor.
*/
RUNNABLE,
/**
* Thread state for a thread blocked waiting for a monitor lock.
* A thread in the blocked state is waiting for a monitor lock
* to enter a synchronized block/method or
* reenter a synchronized block/method after calling
* {@link Object#wait() Object.wait}.
*/
BLOCKED,
/**
* Thread state for a waiting thread.
* A thread is in the waiting state due to calling one of the
* following methods:
* <ul>
* <li>{@link Object#wait() Object.wait} with no timeout</li>
* <li>{@link #join() Thread.join} with no timeout</li>
* <li>{@link LockSupport#park() LockSupport.park}</li>
* </ul>
*
* <p>A thread in the waiting state is waiting for another thread to
* perform a particular action.
*
* For example, a thread that has called <tt>Object.wait()</tt>
* on an object is waiting for another thread to call
* <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on
* that object. A thread that has called <tt>Thread.join()</tt>
* is waiting for a specified thread to terminate.
*/
WAITING,
/**
* Thread state for a waiting thread with a specified waiting time.
* A thread is in the timed waiting state due to calling one of
* the following methods with a specified positive waiting time:
* <ul>
* <li>{@link #sleep Thread.sleep}</li>
* <li>{@link Object#wait(long) Object.wait} with timeout</li>
* <li>{@link #join(long) Thread.join} with timeout</li>
* <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
* <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
* </ul>
*/
TIMED_WAITING,
/**
* Thread state for a terminated thread.
* The thread has completed execution.
*/
TERMINATED;
}
創(chuàng)建狀態(tài)(Thread.State.NEW)
如果創(chuàng)建了一個線程而沒有啟動它,那么,此線程就處于創(chuàng)建狀態(tài)。比如,下述語句執(zhí)行 以后,使系統(tǒng)有了一個處于創(chuàng)建狀態(tài)的線程myThread:
Thread t= new ThreadClass();
其中,ThreadClass()是Thread的子類,而Thread是由java.lang提供的。
處于創(chuàng)建狀態(tài)的線程還沒有獲得應有的資源,所以,這是一個空的線程。線程只有通過啟動后,系統(tǒng)才會為它分配資源。對處于創(chuàng)建狀態(tài)的線程可以進行兩種操作:一是啟動 (start)操作,使其進入可運行狀態(tài),二是終止(stop)操作,使其進入消亡狀態(tài)。如果進入到消 亡狀態(tài),那么,此后這個線程就不能進入其他狀態(tài),也就是說,它不再存在了。
start方法是對應啟動操作的方法,其具體功能是為線程分配必要的系統(tǒng)資源;將線程設置為可運行狀態(tài),從而可以使系統(tǒng)調度這個線程。
通過調用t.start()啟動一個線程,使該線程進入可運行(Thread.State.RUNNABLE)的狀態(tài)。
由JVM的決定去調度(Scheduler) 在可運行狀態(tài)(Runnable)下的線程,使該線程處于運行 (Running) 狀態(tài),由于JVM的調度會出現(xiàn)不可控性,即不是優(yōu)先級高的先被調用,可能先調用,也可能后調用的的情況。運行狀態(tài)(Running)下,調用禮讓yield()方法,可以使線程回到可運行狀態(tài)(Runnable)下,再次JVM的調度(并不依賴優(yōu)先級)。
線程執(zhí)行完畢或異常退出會進入終止狀態(tài)(Thread.State.TERMINATED)。
其余的還有幾個狀態(tài):
Thread.State.BLOCKED
受阻塞并且正在等待監(jiān)視器鎖的某一線程的線程狀態(tài)。處于受阻塞狀態(tài)的某一線程正在等待監(jiān)視器鎖,以便進入一個同步的塊/方法,或者在調用 Object.wait 之后再次進入同步的塊/方法。
Thread.State.WAITING
某一等待線程的線程狀態(tài)。某一線程因為調用下列方法之一而處于等待狀態(tài):
不帶超時值的 Object.wait
不帶超時值的 Thread.join
LockSupport.park
處于等待狀態(tài)的線程正等待另一個線程,以執(zhí)行特定操作。 例如,已經在某一對象上調用了 Object.wait() 的線程正等待另一個線程,以便在該對象上調用 Object.notify() 或 Object.notifyAll()。已經調用了 Thread.join() 的線程正在等待指定線程終止。
TIMED_WAITING具有指定等待時間的某一等待線程的線程狀態(tài)。某一線程因為調用以下帶有指定正等待時間的方法之一而處于定時等待狀態(tài):
Thread.sleep
帶有超時值的 Object.wait
帶有超時值的 Thread.join
LockSupport.parkNanos
LockSupport.parkUntil