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ā)生命力的必由之路。