Java 多線程(一)-線程狀態(tài)

Java 多線程幾乎是面試必問問題,由于多線程涉及的方面非常多,因此分為多篇文章對其講述,方便觀看瀏覽。

線程狀態(tài)

線程的狀態(tài)轉(zhuǎn)換是線程控制的基礎(chǔ)。線程狀態(tài)總的可分為五大狀態(tài):

線程狀態(tài)
New

線程剛剛創(chuàng)建初始化,調(diào)用 start 接口之前

RUNNABLE

線程調(diào)用 start 接口之后,處以可以執(zhí)行狀態(tài),等待被系統(tǒng)調(diào)度和正在執(zhí)行中都是處于這個狀態(tài)

BLOCKED

線程如果處于等待獲取 Monitor 鎖的狀態(tài)

WAITING

處于這個狀態(tài)的線程,說明正在無期限地等待其他線程的某些特定動作

TIMED_WAITING

這個狀態(tài)下的線程,在有限的時間內(nèi)等待其他線程的某些特定動作

TERMINATED

線程執(zhí)行完畢,已經(jīng)退出

狀態(tài)轉(zhuǎn)移

線程各個狀態(tài)之間的轉(zhuǎn)移如下圖所示:

線程狀態(tài)之間的轉(zhuǎn)換

其中以下狀態(tài)的轉(zhuǎn)移需要關(guān)注下:

New -> RUNNABLE

線程實例調(diào)用 start 方法即可進入可運行狀體。
如果正在執(zhí)行的線程運行到 yield 方法,則讓出 CPU 時間片,但狀態(tài)還是 RUNNABLE。

RUNNABLE -> BLOCKED

通常調(diào)用 synchronized 方法,或者嘗試進入 synchronized 程序時,又沒搶占到 Object 的 Monitor 鎖時,會產(chǎn)生這種狀態(tài)遷移。

RUNNABLE -> WAITING

線程調(diào)用 Object.wait() / LockSupport.park() / Thread.join() 方法。

其中 join 方法是 synchronized 方法,內(nèi)部調(diào)用當(dāng)前線程對象的 wait 方法。

RUNNABLE -> TIMED_WAITING

情況和 RUNNABLE -> WAITING 類似,但是增加了 Thread.sleep 情況,調(diào)用 sleep 時 不會釋放 當(dāng)前線程搶占到的 Monitor 鎖,所以當(dāng) sleep 結(jié)束后,依舊進入 RUNNABLE 狀態(tài)。

WAITING -> RUNNABLE

其他線程調(diào)用 Object.notify() / Object.notifyAll() 時,某等待線程被喚醒,同時搶到等待對象的 Monitor鎖。

WAITING -> BLOCKED

其他線程調(diào)用 Object.notify() / Object.notifyAll() 時,某等待線程被喚醒,同時沒有搶到等待對象的 Monitor鎖,只能被阻塞等待其他線程釋放鎖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 一、進程和線程 進程 進程就是一個執(zhí)行中的程序?qū)嵗總€進程都有自己獨立的一塊內(nèi)存空間,一個進程中可以有多個線程。...
    阿敏其人閱讀 2,622評論 0 13
  • Java多線程學(xué)習(xí) [-] 一擴展javalangThread類 二實現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 2,987評論 1 18
  • 本文主要講了java中多線程的使用方法、線程同步、線程數(shù)據(jù)傳遞、線程狀態(tài)及相應(yīng)的一些線程函數(shù)用法、概述等。 首先講...
    李欣陽閱讀 2,493評論 1 15
  • Java-Review-Note——4.多線程 標(biāo)簽: JavaStudy PS:本來是分開三篇的,后來想想還是整...
    coder_pig閱讀 1,677評論 2 17
  • 我們會流淚,我們會受傷,但不要怕,這是我們成長必經(jīng)的過程,我們終將獨自長大。
    王雪慧閱讀 202評論 0 1