線程總是處于以下六種狀態(tài)之一:
線程的所有這些狀態(tài)都是JVM狀態(tài)。
當一個線程被創(chuàng)建并且它的start()方法還沒有被調用時,它處于新的狀態(tài)。
Thread t = new MyThreadClass(); // t is in the new state
準備運行或運行的線程處于可運行狀態(tài)。
如果線程嘗試輸入或重新輸入同步的方法或塊,但該監(jiān)視器正在被另一個線程使用,則該線程處于阻塞狀態(tài)。
線程可以通過調用下表中列出的方法將自身置于等待狀態(tài)。
方法 | 描述 |
---|---|
wait() | 從Object類。 |
join() | 從Thread類。 |
park() | 從java.util.concurrent.locks.LockSupport類。調用此方法的線程可以通過調用線程上的unpark()方法等待直到許可可用。 |
線程可以通過調用下表中列出的方法將自身置于等待等待狀態(tài)。
描述 | 描述 |
---|---|
sleep() | 從Thread類。 |
wait (long millis) wait(long millis, int nanos) | 從Object類。 |
join(long millis) join(long millis, int nanos) | 從Thread類。 |
parkNanos (long nanos) parkNanos (Object blocker, long nanos) | 從LockSupport類,它在java.util.concurrent.locks包中。 |
parkUntil (long deadline) parkUntil (Object blocker, long nanos) | 從LockSupport類,它在java.util.concurrent.locks包中。 |
已完成其執(zhí)行的線程處于終止狀態(tài)。
終止的線程不能轉換到任何其他狀態(tài)。
我們可以使用一個線程的isAlive()方法,在它已經(jīng)啟動后,知道它是否存活或終止。
我們可以使用Thread類中的getState()方法來隨時獲取線程的狀態(tài)。
此方法返回Thread.State枚舉類型的常量之一。
以下代碼演示了線程從一個狀態(tài)到另一個狀態(tài)的轉換。
class ThreadState extends Thread { private boolean keepRunning = true; private boolean wait = false; private Object syncObject = null; public ThreadState(Object syncObject) { this.syncObject = syncObject; } public void run() { while (keepRunning) { synchronized (syncObject) { if (wait) { try { syncObject.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } public void setKeepRunning(boolean keepRunning) { this.keepRunning = keepRunning; } public void setWait(boolean wait) { this.wait = wait; } } public class Main { public static void main(String[] args) throws InterruptedException { Object syncObject = new Object(); ThreadState ts = new ThreadState(syncObject); System.out.println("Before start()-ts.isAlive():" + ts.isAlive()); System.out.println("#1:" + ts.getState()); ts.start(); System.out.println("After start()-ts.isAlive():" + ts.isAlive()); System.out.println("#2:" + ts.getState()); ts.setWait(true); Thread.currentThread().sleep(100); synchronized (syncObject) { System.out.println("#3:" + ts.getState()); ts.setWait(false); syncObject.notifyAll(); } Thread.currentThread().sleep(2000); System.out.println("#4:" + ts.getState()); ts.setKeepRunning(false); Thread.currentThread().sleep(2000); System.out.println("#5:" + ts.getState()); System.out.println("At the end. ts.isAlive():" + ts.isAlive()); } }
上面的代碼生成以下結果。
更多建議: