java 线程状态_浅析Java中的线程状态
一、線程的5種狀態
眾所周知,Java的線程狀態有5種,分別對應上圖中五種不同顏色,下面對這5種狀態及狀態間的轉化做相應的解釋:
1. 初始化狀態:新建一個線程對象
2. 可運行狀態:其他線程調用了該線程對象的start()方法。該狀態的線程位于可運行線程池中,變得可運行,等待獲取CPU的使用權
3. 運行狀態:可運行狀態的線程獲得了cpu 時間片(timeslice),執行程序代碼
4. 阻塞狀態:線程因為某種原因放棄CPU使用權,暫時停止運行。直到線程再次進入可運行狀態,才有機會轉到運行狀態。如圖所示,會有三種不同類型的阻塞狀態:
- 等待阻塞:運行中的線程執行wait()方法,線程會進入等待隊列中。等待notify()、notifyAll()或interrupt()對其喚醒或中斷
- 同步阻塞:運行中的線程執行在獲取同步鎖(注:只有synchronized這種方式的鎖(monitor鎖)才會讓線程出現BLOCKED狀態,等待ReentrantLock則不會)時,若該鎖已被其他線程占用,線程則會進入鎖池隊列。等待獲取到鎖
- 其他阻塞:運行的線程執行sleep()、join(),或觸發了I/O請求,該該線程被置為阻塞狀態。當sleep()狀態超時、join()等待線程終止或超時、I/O處理完成,線程會重新進入可運行狀態。
5. 死亡狀態:線程執行完或因異常退出run()方法,線程生命周期結束
看完上面的配圖和簡介,可能會有人對阻塞狀態的幾種情況有些疑問,下面我們就一點一點解開她的小裙子 圖中同樣都是Blocked狀態,等待隊列和鎖池是什么鬼?
等待隊列和鎖池都和wait()、notify()、synchronized有關,wait()和notify()又必須由對象調用且必須寫在synchronized同步代碼塊內。
a)當前running線程調用對象obj的同步方法時,發現鎖被其他線程持有,則直接進入鎖池。
b)當前等待隊列中阻塞的線程A,等待被線程B喚醒,喚醒后并非直接進去runnable狀態,而是進入線程A所對應的鎖池中,等待搶到鎖。
下圖直觀描繪了running->等待隊列->鎖池->runnable間的狀態流轉,幫助大家理解。
怎么樣,有沒有通透很多?啊!還是有些小迷糊。好,那我們下面從jdk源碼中對線程狀態的描述進行分析
二、Thread.State枚舉類中的BLOCKED、WAITING、TIMED_WAITING
我們打開Jdk源碼中Thread類,會發現里面有定義State的枚舉,枚舉中有:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED。由于線程中的初始化和死亡狀態很短,我們不用太關心,runnable狀態暫無歧義。我們只針對BLOCKED、WAITING、TIMED_WAITING三種可能混淆的狀態進行分析
首先,上源碼
/*** 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,// 受阻塞并且正在等待monitor鎖的某一線程的線程狀態。/*** 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,// 某一等待線程的線程狀態。/*** Thread state for a waiting thread with a specified waiting time.* A thread is in the timed waiting state due to calling one of* the following methods with a specified positive waiting time:* <ul>* <li>{@link #sleep Thread.sleep}</li>* <li>{@link Object#wait(long) Object.wait} with timeout</li>* <li>{@link #join(long) Thread.join} with timeout</li>* <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>* <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>* </ul>*/TIMED_WAITING,// 具有指定等待時間的某一等待線程的線程狀態- 不帶超時值的 Object.wait
- 不帶超時值的 Thread.join
- LockSupport.park 分析:既有可能進入等待隊列,也有可能進入其他阻塞的阻塞狀態
3. TIMED_WAITING場景:某一線程因為調用以下帶有指定正等待時間的方法之一而處于定時等待狀態:
- Thread.sleep(long millis)
- 帶有超時值的 Object.wait
- 帶有超時值的 Thread.join
- LockSupport.parkNanos
- LockSupport.parkUntil 分析:既有可能進入等待隊列,也有可能進入其他阻塞的阻塞狀態。和WAITING區別在于是否指定時間
結合實際編程經驗,及工作中所遇到的情形,仔細回味一下上面兩個模塊的內容,可能就會恍然大悟。
三、并發編程中常用的幾個jdk中的api的理解,可能面試常問哦
總結
以上是生活随笔為你收集整理的java 线程状态_浅析Java中的线程状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中递归函数基例_智慧树pyt
- 下一篇: dubbo web工程示例_分布式开发-