java線程中timed和blocked兩種狀態的區別

今天出去參加一個賣貨公司的interview,抱着學習的態度去看了一下,interviewer還是不錯的,
問的問題都在點上,讓平時對java語言很自信的我,發現自己有些方面,其實理解有嚴重誤區。希望
這篇帖子能給到大家幫助。

java線程的幾種狀態:new,runnable,running,blocked,waiting,timed_waiting,dead
好了,問題來了,blocked和waited有什麼區別:
我之前總有個誤解,完全和正確答案沒有關係,這邊就不出來了,防止誤導大家。
下面我貼出正確答案:

/**
* 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,

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

上面是jdk源碼對這兩種狀態的描述,很明顯了,BLOCKED狀態主要是線程爲了獲取
monitor鎖進去同步塊或者同步同步方法中,被阻塞住,產生的一種阻塞狀態。
而waiting狀態是指,一個線程在等待另外一個線程的某種動作而產生的等待狀態。

再通俗一點說,blocked的是線程推進到某個關卡,門被關上了,這時候只能被迫等待關卡打開。而waiting是指線程在某個地方停下來,需要得到其他線程的信號才能出發。

blocked是被動等待,timed的是主動等待。

BLOCKED狀態: synchronized關鍵字
WAITING狀態: wait,join,park
TIMED_WAITING狀態: sleep,wait,join,parkNanos,parkUntil

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章