檢視執行緒的執行狀態
執行緒共有6中狀態:新建,執行(可執行),阻塞,等待,計時等待和終止。
當使用new操作符建立新執行緒時,執行緒處於“新建”狀態。
當呼叫start()方法時,執行緒處於執行(可執行)狀態。
當執行緒需要獲得物件的內建鎖,而該鎖正被其他執行緒擁有,執行緒處於阻塞狀態。
當執行緒等待其他執行緒通知排程表可以執行時,該執行緒處於等待狀態。
對於一些含有時間引數的方法,如Thread類的sleep()方法,可以使執行緒處於計時等待狀態。
當run()方法執行完畢或出現異常時,執行緒處於終止狀態。
(1)編寫類ThreadState,該類實現了Runnable介面。在該類中定義了3個方法:waitForASecond()方法用於當前執行緒暫時等待0.5秒,waitForYears()方法用於將當前執行緒永久等待,notifyNow()方法用於通知等待狀態的執行緒執行。在run方法中,運行了waitForASecond()和waitForYears()。
public class ThreadState implements Runnable{
public synchronized void waitForASecond() throws InterruptedException{ wait(500); //使當前執行緒等待0.5秒或其他執行緒呼叫notify()或notifyAll()方法 } public synchronized void waitForYears() throws InterruptedException{ wait(); //使當前執行緒永久等待,直到其他執行緒呼叫notify()或notifyAll()方法 } public synchronized void notifyNow(){ notify(); } @Override public void run() { try { waitForASecond(); waitForYears(); } catch (InterruptedException e) { e.printStackTrace(); } }
}
(2)編寫類Test進行測試,在main()方法中,輸出了執行緒的各種不同的狀態。
public class TestThreadState {
public static void main(String[] args) throws InterruptedException {
ThreadState state = new ThreadState();
Thread thread = new Thread(state);
System.out.println(“新建執行緒:”+thread.getState());//輸出執行緒狀態
thread.start(); //呼叫thread物件的start(),啟動新執行緒
System.out.println(“啟動執行緒:”+thread.getState());//輸出執行緒狀態
Thread.sleep(100); //當前執行緒休眠0.1秒,使新執行緒執行waitForASecond()方法
System.out.println(“計時等待:”+thread.getState());//輸出執行緒狀態
Thread.sleep(1000); //當前執行緒休眠1秒,使新執行緒執行waitForYears()方法
System.out.println(“等待執行緒:”+thread.getState());//輸出執行緒狀態
state.notifyNow(); //呼叫state的notifyNow()方法
System.out.println(“喚醒執行緒:”+thread.getState());//輸出執行緒狀態
Thread.sleep(1000); //當前執行緒休眠1秒,使新執行緒結束
System.out.println(“終止執行緒:”+thread.getState());//輸出執行緒狀態
}
}