6個狀態(tài)的定義:java.lang.Thread.State
New: 尚未啟動的線程的線程狀態(tài)。
Runnable: 可運行線程的線程狀態(tài),等待CPU的調(diào)度。
Blocked: 線程阻塞等待監(jiān)視器鎖定的線程狀態(tài)。
-
Waiting: 等待線程的線程狀態(tài)。下列不帶超時的方式:
Object.waiting、Thread.join、LockSupport.port
-
Timed Waiting: 具有指定等待時間的等待線程的線程狀態(tài)。下列帶超時時間的方式:
Thread.sleep、Object.wait、Thread.join、LockSupport.parkNanos、LockSupport.parkUntil
Terminated: 終止線程的線程狀態(tài)。線程正常完成執(zhí)行或者出現(xiàn)異常。

package firthChapter;
/**
* 示例二,多線程運行狀態(tài)切換示意
* @author yekaifei
*/
public class Demo2 {
//第一種狀態(tài)切換: 新建->運行->終止
//第二種狀態(tài)切換: 新建->運行->等待->運行->終止
//第三種狀態(tài)切換: 新建->運行->阻塞->運行->終止
public static void main(String[] args) throws InterruptedException {
System.out.println("第一種狀態(tài)切換: 新建->運行->終止");
Thread thread1 = new Thread(new Runnable() {
public void run() {
System.out.println("thread1當前狀態(tài):" + Thread.currentThread().getState().toString());
System.out.println("thread1執(zhí)行了");
}
});
System.out.println("thread1未運行時狀態(tài):" + thread1.getState().toString());
thread1.start();
Thread.sleep(2000);
System.out.println("線程睡眠兩秒等待thread1運行完畢查看狀態(tài):" + thread1.getState().toString());
// thread1.start(); TODO 注意若線程終止后再調(diào)用會報一個java.lang.IllegalThreadStateException
System.out.println("-------------------------------------------------");
System.out.println("第二種狀態(tài)切換: 新建->運行->等待->運行->終止");
Thread thread2 = new Thread(new Runnable() {
public void run() {
System.out.println("thread2當前狀態(tài):" + Thread.currentThread().getState().toString());
System.out.println("thread2正在執(zhí)行");
try {
System.out.println("thread線程進入等待");
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread2睡眠完畢后當前狀態(tài):" + Thread.currentThread().getState().toString());
}
});
System.out.println("thread2未運行時狀態(tài):" + thread2.getState().toString());
thread2.start();
Thread.sleep(1000);
System.out.println("線程睡眠1s等待thread2進入睡眠查看狀態(tài):" + thread2.getState().toString());
Thread.sleep(1000);
System.out.println("線程再睡眠1s等待thread2運行完畢后查看狀態(tài):" + thread2.getState().toString());
System.out.println("-------------------------------------------------");
System.out.println("第三種狀態(tài)切換: 新建->運行->阻塞->運行->終止");
Thread thread3 = new Thread(new Runnable() {
public void run() {
System.out.println("thread3當前狀態(tài):" + Thread.currentThread().getState().toString());
synchronized (Demo2.class){
System.out.println("thread3當前狀態(tài):" + Thread.currentThread().getState().toString());
}
}
});
synchronized (Demo2.class) {
System.out.println("thread3未運行時狀態(tài):" + thread3.getState().toString());
thread3.start();
Thread.sleep(500);
System.out.println("thread3進入阻塞狀態(tài):" + thread3.getState().toString());
}
Thread.sleep(2000);
System.out.println("線程睡眠2s等待thread3運行完畢查看狀態(tài):" + thread3.getState().toString());
}
}
運行結(jié)果:
firthChapter.Demo2
第一種狀態(tài)切換: 新建->運行->終止
thread1未運行時狀態(tài):NEW
thread1當前狀態(tài):RUNNABLE
thread1執(zhí)行了
線程睡眠兩秒等待thread1運行完畢查看狀態(tài):TERMINATED
第二種狀態(tài)切換: 新建->運行->等待->運行->終止
thread2未運行時狀態(tài):NEW
thread2當前狀態(tài):RUNNABLE
thread2正在執(zhí)行
thread線程進入等待
線程睡眠1s等待thread2進入睡眠查看狀態(tài):TIMED_WAITING
thread2睡眠完畢后當前狀態(tài):RUNNABLE
線程再睡眠1s等待thread2運行完畢后查看狀態(tài):TERMINATED
第三種狀態(tài)切換: 新建->運行->阻塞->運行->終止
thread3未運行時狀態(tài):NEW
thread3當前狀態(tài):RUNNABLE
thread3進入阻塞狀態(tài):BLOCKED
thread3當前狀態(tài):RUNNABLE
線程睡眠2s等待thread3運行完畢查看狀態(tài):TERMINATED
Process finished with exit code 0