天天看點

檢視線程的運作狀态

線程共有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());//輸出線程狀态

}

}

繼續閱讀