面試:Java線程有哪幾種狀態(tài),它們之間是如何切換的
狀態(tài)概述
java.lang.Thread.State 的枚舉里。for (Thread.State state : Thread.State.values()) {
System.out.println(state);
}
打印結(jié)果:
NEW
RUNNABLE
BLOCKED
WAITING
TIMED_WAITING
TERMINATED
New 初始化狀態(tài) Runnable 可執(zhí)行狀態(tài),包含Ready狀態(tài)和Running狀態(tài),當(dāng)線程start()方法被調(diào)用,線程處于可被線程調(diào)度器選中執(zhí)行的狀態(tài),就是Ready。待到被執(zhí)行時(shí)就是Running狀態(tài)。等獲得CPU時(shí)間片后變?yōu)檫\(yùn)行中狀態(tài)Running。 Waiting 等待被喚醒 Timed waiting 等待一段時(shí)間后自動(dòng)喚醒 Blocked 線程阻塞,等待鎖 Terminated 線程結(jié)束
狀態(tài)如何切換
狀態(tài)切換圖:

簡(jiǎn)單狀態(tài)切換 NEW -> RUNNABLE -> TERMINATED
Thread t1 = new Thread(()->{
System.out.println("Thread go!");
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
//NEW
System.out.println("執(zhí)行new后狀態(tài) 1::" + t1.getState());
t1.start();
//RUNNABLE
System.out.println("執(zhí)行start后狀態(tài) 2::" + t1.getState());
//等待線程執(zhí)行完畢
t1.join();
//TERMINATED
System.out.println("執(zhí)行join后的狀態(tài) 3::" + t1.getState());
打印結(jié)果:
執(zhí)行new后狀態(tài) 1::NEW
執(zhí)行start后狀態(tài) 2::RUNNABLE
Thread go!
執(zhí)行join后的狀態(tài) 3::TERMINATED
WAITING & TIMED_WAITING
Thread t2 = new Thread(() -> {
LockSupport.park();
System.out.println("t2 run begin");
try {
//睡眠3s
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
t2.start();
//主線程睡眠1s
TimeUnit.SECONDS.sleep(1);
System.out.println("t2 park:" + t2.getState());//WAITING
//喚醒t2
LockSupport.unpark(t2);
//主線程睡眠1s:確認(rèn)t2被叫醒
TimeUnit.SECONDS.sleep(1);
System.out.println("t2 unpark:" + t2.getState());//TIMED_WAITING1
Blocked
final Object o = new Object();
Thread t3 = new Thread(() -> {
synchronized (o) {
System.out.println("t3 start!");
}
});
Thread t4 = new Thread(() -> {
synchronized (o) {
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t4 start");
}
});
//t4 start拿到鎖
t4.start();
//主線程睡一秒,保證t4已經(jīng)拿到鎖
Thread.sleep(1);
//t3 start競(jìng)爭(zhēng)鎖
t3.start();
Thread.sleep(1);
System.out.println("t3狀態(tài):" + t3.getState());//Blocked
總結(jié)
有道無(wú)術(shù),術(shù)可成;有術(shù)無(wú)道,止于術(shù)
歡迎大家關(guān)注Java之道公眾號(hào)
好文章,我在看??
評(píng)論
圖片
表情
