线程共有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());//输出线程状态
}
}