• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 線程的幾種狀態你真的了解么

    標簽: Java  線程池  多線程  java  thread  并發編程  面試  

    線程狀態介紹

    這里我們講的是Java中的線程狀態。

    線程狀態如下:

    • 線程初始狀態:NEW

    • 線程運行狀態:RUNNABLE

    • 線程阻塞狀態:BLOCKED

    • 線程等待狀態:WAITING

    • 超時等待狀態:TIMED_WAITING

    • 線程終止狀態:TERMINATED

    其中等待狀態應該是一個比較復雜且重要的狀態。

    線程進入等待狀態,即線程因為某種原因放棄了CPU使用權,阻塞也分為幾種情況:

    • 等待阻塞:運行的線程執行wait方法,JVM會把當前線程放入到等待隊列

    • 同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被其他線程鎖占用了,那么JVM會把當前的線程放入到鎖池中

    • 其他阻塞:運行的線程執行Thread.sleep或者join方法,或者發出了I/O請求時,JVM會把當前線程設置為阻塞狀態,當sleep結束join線程終止、I/O處理完畢則線程恢復

    線程狀態間的轉換如下圖:

    下面我將講解哪些情況會進入這些狀態。

    線程sleep時的狀態

    運行結果

    new t1 t1 的狀態:NEW
    t1 running is false,t1將sleep
    t1.sleep()時的狀態:TIMED_WAITING
    

    我們來分析一下,當new Thread時,線程t1[Thread-0]狀態為NEW。線程啟動,執行run()方法,打印t1 running is false,t1將sleep,此時線程t1睡眠。然后主線程睡眠,變量running設置為false。這線程t1還在睡眠中。再將主線程睡眠,線程t1仍然在睡眠中。此時線程t1的狀態為TIMED_WAITING

    如果我們將線程t1中的睡眠時間修改一下

    Thread.sleep(10000L);  -> Thread.sleep(3000L);
    

    再來看看運行結果

    new t1 t1 的狀態:NEW
    t1 running is false,t1將sleep
    t1.sleep()時的狀態:TERMINATED
    

    線程t1終止,所以說看代碼時不要認為一看到sleep()就是超時等待【TIMED_WAITING】狀態。要看看線程是否已經終止了。

    線程join時的狀態

    運行結果如下

    t2中執行t1.join(5000L)
    t2的狀態:TIMED_WAITING
    t2中執行t1.join()
    t2的狀態:WAITING
    t2執行完
    

    當執行

    t1.start();
    t2.start();
    

    線程t1執行睡眠,此時進入線程t2,并執行t2中執行t1.join(5000L)。接下來t1會搶占,進入主線程,主線程睡眠,此時t2還在等待t1,所以t2的線程狀態為【TIMED_WAITING】。這時主線程又睡眠,t2里面開始執行t1.join(),此時t2的狀態為【WAITING】。

    線程synchronized時的狀態

    我們來看運行結果

    t1搶不到鎖的狀態:BLOCKED
    t1搶到鎖
    

    主線程啟動,先搶到鎖。此時t1.start()啟動了t1線程,這時候主線程睡眠,鎖還沒有釋放。此時的t1狀態為【BLOCKED】。

    線程wait時的狀態

    運行結果

    t1將wait(1000L)
    t1的狀態:TIMED_WAITING
    t1的狀態:BLOCKED
    t1將wait
    t1的狀態:WAITING
    t1將執行完
    t1的狀態:RUNNABLE
    t1的狀態:TERMINATED
    

    主線程啟動,執行t1.start(),進入t1,執行t1將wait(1000L),此時t1讓出鎖。在t1超時等待的同時,主線程睡眠。當后,這里主線程搶到鎖,t1的狀態為【TIMED_WAITING】。這時主線程執行object.notify(),但這時鎖還沒有釋放,t1還沒有獲取到鎖,所以t1狀態【BLOCKED】。之后主線程釋放鎖,t1獲得鎖,執行object.wait(),這時t1的狀態【WAITING】。然后回到主線程,并獲得鎖,執行object.notify()。此時t1線程被喚醒并處于運行狀態【RUNNABLE】。t1執行完成,狀態為【TERMINATED】。

    線程park()時的狀態

    t1 park后的狀態:WAITING
    t1 unpark后的狀態:WAITING
    

    大家可以思考下線程t1為什么是這個狀態,有機會我會寫一篇LockSupport的文章。

    往期推薦

    掃碼二維碼,獲取更多精彩。或微信搜Lvshen_9,可后臺回復獲取資料

    1.回復"java" 獲取java電子書;
    
    2.回復"python"獲取python電子書;
    
    3.回復"算法"獲取算法電子書;
    
    4.回復"大數據"獲取大數據電子書;
    
    5.回復"spring"獲取SpringBoot的學習視頻。
    
    6.回復"面試"獲取一線大廠面試資料
    
    7.回復"進階之路"獲取Java進階之路的思維導圖
    
    8.回復"手冊"獲取阿里巴巴Java開發手冊(嵩山終極版)
    
    9.回復"總結"獲取Java后端面試經驗總結PDF版
    
    10.回復"Redis"獲取Redis命令手冊,和Redis專項面試習題(PDF)
    
    11.回復"并發導圖"獲取Java并發編程思維導圖(xmind終極版)

    另:點擊【我的福利】有更多驚喜哦。

    版權聲明:本文為wujialv原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/wujialv/article/details/108506393

    智能推薦

    線程的幾種狀態

    線程狀態和sleep/yieId/join/stop/destroy方法 新生狀態          用new關鍵字和Thread類或其子類建立一個線程對象后,該線程對象就處于新生狀態。處于新生狀態的線程有自己的內存空間,通過調用start方法進入就緒狀態(runnable) 就緒狀態   &nbs...

    番茄鐘工作法:你真的了解番茄鐘么?

    1. 什么是番茄工作法 番茄工作法的發明者 意大利人弗朗西斯科·西里洛于1992年創立了番茄工作法。他和我們大多數人一樣,是一個重度拖延癥患者。他在大學生活的頭幾年,曾一度苦于學習效率低下,于是他做了個簡單的實驗:我就不信我不能專注10分鐘。他找來形狀像番茄的廚房定時器,調到10分鐘來督促自己專注。后來,他把這個方法加以改進,形成了番茄工作法。 番茄工作法的一句話描述 列出每天工作任...

    for循環用了那么多次,但你真的了解它么?

    一、基礎的for循環 0、使用while也是一種循環方式,此處探究for相關的循環,就不做拓展了。 1、遍歷數組的時候,初學時是使用的如下樣式的for循環: 2、而遍歷集合的時候使用的都是Iterator迭代器: 給定一組人名,兩兩組隊(此處允許自己和自己組隊),實現如下: 想象中的寫法是: 但是執行過后你會發現這段代碼是有瑕疵的,出現的結果只有四組: 那么剩下的組合去哪里了呢? 這里程序并不會拋...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    猜你喜歡

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    精品国产乱码久久久久久蜜桃不卡