生活随笔
收集整理的這篇文章主要介紹了
面试:Java线程有哪几种状态,它们之间是如何切换的
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
多線程歷來是面試重災(zāi)區(qū),有時對多線程的掌握程度決定了開發(fā)者的級別。想掌握多線程還是需要在實際工作中多應(yīng)用。
而實際上經(jīng)常用多線程開發(fā)的開發(fā)者并不多。但面試要問怎么辦,只能是面向面試來學(xué)習(xí)。各個擊破,事半功倍。
狀態(tài)概述
今天我們來聊聊多線程之狀態(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í)行時就是Running狀態(tài)。等獲得CPU時間片后變?yōu)檫\(yùn)行中狀態(tài)Running。
Waiting ?等待被喚醒
Timed waiting 等待一段時間后自動喚醒
Blocked 線程阻塞,等待鎖
Terminated 線程結(jié)束
狀態(tài)如何切換
狀態(tài)切換圖:
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
Thread?t2?=?new?Thread(()?->?{LockSupport.park();System.out.println("t2?run?begin");try?{//睡眠3sTimeUnit.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
??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競爭鎖t3.start();Thread.sleep(1);System.out.println("t3狀態(tài):"?+?t3.getState());//Blocked
總結(jié)
這個小知識點(diǎn)比較簡單,就不多做解釋。積沙成塔,祝福面試成功。
學(xué)習(xí)就是今天比昨天進(jìn)步一點(diǎn)點(diǎn),加油Coder!
有道無術(shù),術(shù)可成;有術(shù)無道,止于術(shù)
歡迎大家關(guān)注Java之道公眾號
好文章,我在看??
總結(jié)
以上是生活随笔為你收集整理的面试:Java线程有哪几种状态,它们之间是如何切换的的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。