本文目錄一覽:
java線程中的幾種狀態以及相互轉換
NEW: 線程創建之後,但是還沒有啟動(not yet started)。
RUNNABLE: 正在Java虛擬機下跑任務的線程的狀態。在RUNNABLE狀態下的線程可能會處於等待狀態, 因為它正在等待一些系統資源的釋放,比如IO
BLOCKED: 阻塞狀態,等待鎖的釋放,比如線程A進入了一個synchronized方法,線程B也想進入這個方法,但是這個方法的鎖已經被線程A獲取了,這個時候線程B就處於BLOCKED狀態
WAITING: 等待狀態,處於等待狀態的線程是由於執行了3個方法中的任意方法。 1. Object的wait方法,並且沒有使用timeout參數; 2. Thread的join方法,沒有使用timeout參數 3. LockSupport的park方法。 處於waiting狀態的線程會等待另外一個線程處理特殊的行為。 再舉個例子,如果一個線程調用了一個對象的wait方法,那麼這個線程就會處於waiting狀態直到另外一個線程調用這個對象的notify或者notifyAll方法後才會解除這個狀態
TIMED_WAITING: 有等待時間的等待狀態,比如調用了以下幾個方法中的任意方法,並且指定了等待時間,線程就會處於這個狀態。 1. Thread.sleep方法 2. Object的wait方法,帶有時間 3. Thread.join方法,帶有時間 4. LockSupport的parkNanos方法,帶有時間 5. LockSupport的parkUntil方法,帶有時間
TERMINATED: 線程中止的狀態,這個線程已經完整地執行了它的任務
JAVA中線程有哪五個基本狀態?它們之間如何讓轉化?
java中,每個線程都需經歷新生、就緒、運行、阻塞和死亡五種狀態,線程從新生到死亡的狀態變化稱為生命周期。
用new運算符和Thread類或其子類建立一個線程對象後,該線程就處於新生狀態。
新生—就緒:通過調用start()方法
就緒—運行:處於就緒狀態的線程一旦得到CPU,就進入運行狀態並自動調用自己的run()方法
運行—阻塞:處於運行狀態的線程,執行sleep()方法,或等待I/O設備資源,讓出CPU並暫時中止自己運行,進入阻塞狀態
阻塞—就緒:睡眠時間已到,或等待的I/O設備空閑下來,線程便進入就緒狀態,重新到就緒隊列中等待CPU。當再次獲得CPU時,便從原來中止位置開始繼續運行。
運行—死亡:(1)(正常情況下)線程任務完成
(2)(非正常狀況)線程被強制性的中止,如通過執行stop()或destroy()方法來終止一個線程
談談OpenJDK中線程的9種狀態
我在在查找了很多資料還有根據書籍,發現對於線程的狀態,網上的說法各種各樣的,這裡就想做一個總結。
在jdk1.8 的源碼當中,java中線程(Thread)的狀態,注釋里說的很清楚了,沿用的是1.5的,主要分為6種狀態,每種狀態之間都可以隨着操作進行相互轉換。後面會有OpenJDK的說法,一共是九種,別著急。
1.新建狀態(New):
新創建了一個線程對象這個時候沒有對他調用和執行。
2.運行中狀態 RUNNABLE:
該狀態可以被看成一 個複合狀態。它包括兩個子狀態 :READY和RUNNING。前者表示處於該狀態的線程可以被線程調度器(Scheduler)進行調度而使之處於RUNNING狀態。後者表示處於該狀態的線程正在運行,即相應線程對象的run方法所對應的指令正在由處理器執行。執行Thread.yield()的線程,其狀態可能會由RUNNING轉換為READY。處於READY子狀態的線程也被稱為活躍線程。
3.阻塞狀態 BLOCKED:
一 個線程發起一個阻塞式 1/0 (Blocking I/0)操作後 12 , 或者申請一個由其他線程持有的獨佔資源(比如鎖)時,相應的線程會處於該狀態。處於BLOCKED狀態的線程並不會佔用處理器資源。當阻塞式I/0操作完成後,或者線程獲得了其申請的資源,該線程的狀態又可以轉換為RUNNABLE。
一 個線程執行了某些特定方法之後就會處於這種等待其他線程執行另外一些特定操作的狀態。能夠使其執行線程變為WAITING狀態的方法包括Object. wait()、 Thread.join()、LockSupport.park(Object)。能夠使相應線程從WAITING變更為RUNNABLE的相應方法包括: Object.notify()/notify All()和LockSupport. unpark(Object))。
該狀態和WAITING類似,差別在於處於該狀態的線程並非尤限制地等待其他線程執行特定操作,而是處於帶有時間限制的等待狀態。當其他線程沒有在指定時間內執行該線程所期望的特定操作時,該線程的狀態自動轉換為RUNNABLE。
6.終止狀態 TERMINATED:
已經執行結束的線程處於該狀態。由於一 個線程實例只能夠被啟動一 次,因此一 個線程也只可能有一次處於該狀態。Thread.run()正常返回或者由於拋出異常而提前終止都會導致相應線程處於該狀態。
附上源碼
public enum State {
/**
* Thread state for a thread which has not yet started.
*/
NEW,
以上是在JDK1.8中的Thread源碼中備註的。
然而也有一種說法,在JVM中對狀態的定義是九種,這裡說的是在OpenJDK中的
2.運行 (RUNNABLE):筆者的理解就是,start之後線程進入到run方法,執行run方法的狀態,也就是網上所說的準備(ready)和運行(running);
3.睡眠(SLEEPING):線程調用sleep(),之後抱鎖等待的狀態;
4.對象等待(IN_OBJECT_WAIT):也就是對象調用wait()方法之後的釋放鎖等待;
5.對象超時等待(IN_OBJECT_WAIT_TIMED):該狀態不同於WAITING,它可以在指定的時間後自行返回
6.掛起(PARKED):該狀態是線程沒有拿到鎖之後,進入等待隊列之後一直處於掛起狀態;
7.掛起超時(PARKED_TIMED):該狀態不同於PARKED,它可以在指定的時間後自行解除掛起
8.阻塞監視(BLOCKED_ON_MONITOR_ENTER):進入同步之後的狀態,也就是線程進入到同步塊中,或者同步鎖中的狀態,讀者也可以理解為線程進入獨佔模式下的狀態;
9.終止(TERMINATED):表示該線程已經執行完畢;
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/151758.html