java線程waiting與blocked的區(qū)別

java線程中含有waiting與blocked兩種狀態(tài),兩種狀態(tài)有著明顯的區(qū)別,本文從jdk源碼中兩種狀態(tài)的設(shè)計角度和狀態(tài)進(jìn)入角度來分析兩者的區(qū)別。

源碼分析

    /*
     * Thread state for a thread blocked waiting for a monitor lock.
     * A thread in the blocked state is waiting for a monitor lock
     * to enter a synchronized block/method or
     * reenter a synchronized block/method after calling
     * {@link Object#wait() Object.wait}.
     */
    BLOCKED,

處于 blocked狀態(tài)的線程等待獲取監(jiān)視器鎖以期進(jìn)入同步代碼塊/方法中。

    /**
     * Thread state for a waiting thread.
     * A thread is in the waiting state due to calling one of the
     * following methods:
     * <ul>
     *   <li>{@link Object#wait() Object.wait} with no timeout</li>
     *   <li>{@link #join() Thread.join} with no timeout</li>
     *   <li>{@link LockSupport#park() LockSupport.park}</li>
     * </ul>
     *
     * <p>A thread in the waiting state is waiting for another thread to
     * perform a particular action.
     *
     * For example, a thread that has called <tt>Object.wait()</tt>
     * on an object is waiting for another thread to call
     * <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on
     * that object. A thread that has called <tt>Thread.join()</tt>
     * is waiting for a specified thread to terminate.
     */
    WAITING,

文檔介紹了導(dǎo)致線程進(jìn)入Wating狀態(tài)的原因以及如何退出Wating狀態(tài)。

區(qū)別

線程可以通過wait,join,LockSupport.park方式進(jìn)入wating狀態(tài),進(jìn)入wating狀態(tài)的線程等待喚醒(notify或notifyAll)才有機(jī)會獲取cpu的時間片段來繼續(xù)執(zhí)行。

線程的 blocked狀態(tài)往往是無法進(jìn)入同步方法/代碼塊來完成的。這是因為無法獲取到與同步方法/代碼塊相關(guān)聯(lián)的鎖。

與wating狀態(tài)相關(guān)聯(lián)的是等待隊列,與blocked狀態(tài)相關(guān)的是同步隊列,一個線程由等待隊列遷移到同步隊列時,線程狀態(tài)將會由wating轉(zhuǎn)化為blocked。可以這樣說,blocked狀態(tài)是處于wating狀態(tài)的線程重新煥發(fā)生命力的必由之路。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、進(jìn)程和線程 進(jìn)程 進(jìn)程就是一個執(zhí)行中的程序?qū)嵗?,每個進(jìn)程都有自己獨立的一塊內(nèi)存空間,一個進(jìn)程中可以有多個線程。...
    阿敏其人閱讀 2,688評論 0 13
  • 下面是我自己收集整理的Java線程相關(guān)的面試題,可以用它來好好準(zhǔn)備面試。 參考文檔:-《Java核心技術(shù) 卷一》-...
    阿呆變Geek閱讀 15,120評論 14 507
  • 一、線程概念 1. 操作系統(tǒng)中的線程現(xiàn)在的操作系統(tǒng)是多任務(wù)操作系統(tǒng),多線程是實現(xiàn)多任務(wù)的一種方式,在操作系統(tǒng)中,每...
    TyiMan閱讀 1,997評論 1 35
  • 一、多線程 說明下線程的狀態(tài) java中的線程一共有 5 種狀態(tài)。 NEW:這種情況指的是,通過 New 關(guān)鍵字創(chuàng)...
    Java旅行者閱讀 4,849評論 0 44
  • 原編者按:汪曾祺不僅是一位作家,還是一位道地的美食家。無論是家常小食,還是地方風(fēng)味,甚至于生活里最平淡無奇的一碗熱...
    福茶之心閱讀 333評論 0 1

友情鏈接更多精彩內(nèi)容