日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

面试:Java线程有哪几种状态,它们之间是如何切换的

發(fā)布時間:2025/3/16 java 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面试: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)切換圖:

    • 簡單狀態(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?{//睡眠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
    • 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競爭鎖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)容還不錯,歡迎將生活随笔推薦給好友。