一、關(guān)于線程的狀態(tài)
進(jìn)程最核心的狀態(tài),一個(gè)是就緒狀態(tài),一個(gè)是阻塞狀態(tài)(對(duì)于線程同樣使用)。
以線程為單位進(jìn)行調(diào)度的。
在Java中,又給線程賦予了一些其他的狀態(tài)。
線程的狀態(tài)是一個(gè)枚舉類(lèi)型 Thread.State
public class ThreadState {
public static void main(String[] args) {
for (Thread.State state : Thread.State.values()) { //遍歷枚舉中的每個(gè)元素
System.out.println(state);
}
}
}
二、觀察線程的所有狀態(tài)
線程的狀態(tài)一共有6個(gè):
- NEW:安排了工作, 還未開(kāi)始行動(dòng)。(Thread對(duì)象已經(jīng)有了,.start()方法還沒(méi)調(diào)用)
- TERMINATED:工作完成了。(Thread對(duì)象還在,內(nèi)核中的線程已經(jīng)沒(méi)了)
- RUNNABLE:可工作的,又可以分成正在工作中和即將開(kāi)始工作。(就緒狀態(tài) 線程已經(jīng)在cpu上執(zhí)行了/線程正在排隊(duì)等待上cpu執(zhí)行)
- TIMED_WAITING:表示排隊(duì)等待其他事情(阻塞,由于sleep這種固定的方式產(chǎn)生的阻塞)
- WAITING:表示排隊(duì)等待其他事情(阻塞,由于wait這種不固定時(shí)間的方式產(chǎn)生的阻塞)
- BLOCKED:表示排隊(duì)等待其他事情(阻塞,由于鎖競(jìng)爭(zhēng)導(dǎo)致的阻塞)
后三個(gè)都是阻塞狀態(tài),是把三種不同的阻塞狀態(tài)的原因給拎出來(lái)了。這樣后續(xù)定位“線程卡死”問(wèn)題的時(shí)候,就很容易通過(guò)狀態(tài)來(lái)初步確定卡死的原因是什么了。
1. NEW狀態(tài)
并沒(méi)有調(diào)用start() 也并沒(méi)有調(diào)用線程,此時(shí)它對(duì)象里面的狀態(tài)就是new狀態(tài)(開(kāi)始狀態(tài))。
public static void main(String[] args) {
Thread t = new Thread(() -> {
while (true) {
}
});
//在調(diào)用 start 之前獲取狀態(tài),此時(shí)就是NEW狀態(tài)
System.out.println(t.getState()); //并沒(méi)有調(diào)用start() 也并沒(méi)有調(diào)用線程,此時(shí)它對(duì)象里面的狀態(tài)就是new狀態(tài)
//運(yùn)行結(jié)果:NEW
2. TERMINATED狀態(tài)
在線程執(zhí)行結(jié)束之后,獲取線程狀態(tài),此時(shí)是TERMINARED狀態(tài)(結(jié)束狀態(tài))。
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
});
t.start();
t.join(); //通過(guò)join方法進(jìn)行等待
//在線程執(zhí)行結(jié)束之后,獲取線程的狀態(tài),此時(shí)是TERMINARED狀態(tài)
System.out.println(t.getState());
//執(zhí)行結(jié)果:TERMINARED
3. RUNNABLE狀態(tài)
表示此線程正在運(yùn)行當(dāng)中,或者它隨時(shí)準(zhǔn)備去運(yùn)行,此時(shí)它就是就緒狀態(tài)。
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
while (true) { //此線程全速運(yùn)行
}
});
t.start();
for (int i = 0; i < 5; i++) {
System.out.println(t.getState());
Thread.sleep(1000); //主線程中,每隔1秒鐘打印一次
}
}
//運(yùn)行結(jié)果:
RUNNABLE
RUNNABLE
RUNNABLE
RUNNABLE
RUNNABLE
//且RUNNABLE每1s中運(yùn)行一次
4. TIMED_WAITING
表示指定一定時(shí)間來(lái)進(jìn)行等待。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-805475.html
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
while (true) {
try {
Thread.sleep(1000); //等待1s
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t.start();
for (int i = 0; i < 5; i++) {
System.out.println(t.getState());
Thread.sleep(1000);
}
}
}
//輸出結(jié)果:
RUNNABLE
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
//設(shè)置了等待1s再執(zhí)行,所以第1s沒(méi)有執(zhí)行到,打印主線程的代碼
上述內(nèi)容,是多進(jìn)程中的四種狀態(tài)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-805475.html
到了這里,關(guān)于JavaEE之多線程編程:3. 線程的狀態(tài)(易懂!)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!