線程狀態的定義
線程對象在不同的運行時期有不同的狀態,這些狀態就定義在java.lang.Thread.State
枚舉類中
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
線程狀態的解釋
- 尚未啓動的線程處於
NEW
狀態 - 在JVM中執行的線程處於
RUNNABLE
狀態 - 受阻塞並 等待某個監視器鎖的線程處於
BLOCKED
狀態 - 等待另一個線程來執行某一特定操作的線程處於
WAITING
狀態 - 等待另一個線程來執行取決於指定等待時間的操作的線程處於
TIMED_WAITING
狀態 - 已退出的線程處於
TERMINATED
狀態
驗證線程狀態
- NEW
Thread t = new Thread();
System.out.println(t.getState());
Thread
對象在創建後,沒有調用start
方法前,其狀態爲NEW
- RUNNABLE
Thread t = new Thread(()-> System.out.println(Thread.currentThread().getState()));
t.start();
調用start
方法後,線程在執行時,其狀態爲RUNNABLE
- TERMINATED
Thread t = new Thread();
TimeUnit.SECONDS.sleep(1);
System.out.println(t.getState());
線程執行結束後,其狀態爲TERMINATED
- BLOCKED
public class BlockedTest {
public synchronized static void service(){
System.out.println(Thread.currentThread().getName() + "進入業務方法");
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(()->{service();});
Thread t2 = new Thread(()->{service();});
t1.setName("T1");
t2.setName("T2");
t1.start();
TimeUnit.SECONDS.sleep(1);
t2.start();
TimeUnit.SECONDS.sleep(1);
System.out.println("T2 狀態" + t2.getState());
}
}
線程T1
執行後,獲得了鎖,在T2
執行時,發現鎖已經被佔用,所以出於等待狀態,所以在最後輸出時,T2
的狀態爲BLOCKED
- WAITING
public class WaitThread {
public static final Object lock = new Object();
public static void main(String[] args) {
Thread t = new Thread(()-> {
try {
synchronized (lock){
lock.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
t.start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(t.getState());
}
}
當前線程中的鎖對象執行了wait
方法之後,線程就處於WAITING
狀態,如果線程中的鎖對象想執行了wait(long timeout)
,線程就處於TIMED_WAITING
狀態