线程的状态及方法
文章目錄
- 線程的狀態及狀態轉換
- 線程狀態
- 新建狀態(NEW)
- 就緒狀態(RUNNABLE)
- 運行狀態(RUNNING)
- 阻塞狀態(BLOCKED)
- 等待狀態(WAITING)
- 睡眠等待(TIMED_WAITING)
- 終止狀態(TERMINATED)
- 線程狀態轉換
- 線程方法
- start():啟動線程
- run():子線程執行體
- yield():線程讓步
- sleep():線程睡眠
- join():線程同步
- interrupt():**中斷線程**
- deamon:守護線程
- Priority:線程優先級
線程的狀態及狀態轉換
線程狀態
jdk中提供了線程的狀態,在Thread類中提供了一個內部的枚舉類:State
public enum State {NEW,//新建狀態RUNNABLE,//就緒狀態BLOCKED,//阻塞狀態WAITING,//等待狀態TIMED_WAITING,//睡眠等待狀態TERMINATED;//終止狀態}新建狀態(NEW)
用new語句創建的線程處于新建狀態,此時和其他對象一樣,在堆中僅僅給他分配了內存
就緒狀態(RUNNABLE)
當一個線程創建后,調用了start方法,線程狀態就進入到就緒狀態,處于就緒狀態的線程意味著所有需要的資源已經裝備就緒,等待CPU的調用,CPU的調度是由操作系統控制的,用戶無法操控
運行狀態(RUNNING)
處于運行狀態的線程占用CPU資源,執行程序代碼,只有處于就緒狀態的線程才能有機會進入到運行狀態
1、如果一個時間片用完或者調用yield方法,線程會從運行狀態進入到就緒狀態
2、如果線程已經執行結束了,線程會從運行狀態進入終止狀態
3、如果線程執行過程中因為等待一些資源而進入阻塞狀態(WAITING、TIME_WAITTING、BLOCKED)
阻塞狀態(BLOCKED)
進入這種阻塞狀態的原因可以是:線程期望進入同步方法或者同步代碼塊(Synchronized),尚未獲取到鎖資源的情況下,可以從運行狀態進入到blocked狀態
等待狀態(WAITING)
如果調用wait()方法,就進入到waiting狀態,即調用wait()會觸發線程從運行狀態進入到阻塞狀態而無法執行,直到其他線程發出notify或notifyAll這個方法,此時線程才會從waiting狀態進入到blocked狀態,進而進入就緒狀態
睡眠等待(TIMED_WAITING)
如果線程調用sleep(long)、join(long)、wait(long)等方法是,會觸發線程進入到TIMED_WAITING狀態,即指定了阻塞的時間,到達了給定的時間后就可以繼續進入就緒狀態等待CPU的調度
終止狀態(TERMINATED)
當線程退出run()方法時,線程就進入了終止狀態,該狀態是結束線程的聲明周期
線程狀態轉換
一個線程的生命周期中需要的狀態:NEW、RUNNABLE、RUNNING、TERMINATED四個狀態,當線程需要響應特定資源時,進入到阻塞狀態:BLOCKED、WATING、TIMED_WAITING狀態
線程方法
start():啟動線程
start方法作用是用來啟動一個新線程,start方法需要首先調用,start方法是不能被重復調用的
public synchronized void start() {if (threadStatus != 0)throw new IllegalThreadStateException();group.add(this);boolean started = false;try {start0();started = true;} finally {try {if (!started) {group.threadStartFailed(this);}} catch (Throwable ignore) {}}}private native void start0();tart方法的實現是調用了一個native的方法,本質上java創建的多線程其實是有操作系統所提供的多線程方式來創建的
start方法啟動子線程是通過調用系統提供的方式來啟動線程
run():子線程執行體
run方法中是子線程的執行體
run方法和普通的成員方法一樣,可以被重復調用,如果在當前線程調用執行run(),是不會啟動新線程
yield():線程讓步
public static native void yield();yield方法是定義在Thread類下的靜態方法
當線程中調用yield方法,會讓當前正在執行的線程由”RUNNING“狀態進入到”RUNABLE狀態“,線程鎖占用的鎖是不會釋放的
yield讓出CPU的執行權,當讓給誰,是由系統決定的,系統會讓具有相同優先級的或更高優先級的線程獲取CPU執行權,如果沒有相應優先級的線程,當前線程就會立即執行
sleep():線程睡眠
是讓線程休眠,而且是哪個線程調用,就是那個線程休眠
sleep方法是Thread類下的靜態方法,該方法執行過程中會拋出InterruptedException異常,即可以終止異常
sleep所在的線程休眠期間,線程會釋放掉CPU資源給其他線程,但如果當前線程本身持有鎖,鎖是不會釋放的,
線程會由”RUNNING“狀態進入到TIMED_WAITING狀態,當到達休眠時間或者是被中斷掉休眠,就會從睡眠狀態進入到就緒狀態,從而等待CPU的調用
方法:
sleep(long millis)
sleep(long millis, int nanos)
這兩個方法都是Thread類的靜態方法,不屬于某個對象
join():線程同步
暫停當前線程,等待子線程的執行,也稱之為線程合并,join方法特點將并行執行的事情合并為串行執行。
例如:如果在ta線程中調用tb.join(),則讓ta線程停止執行,并讓tb線程先執行,直到tb線程執行完畢,ta線程才能繼續執行
interrupt():中斷線程
用來中斷當前線程,終止處于阻塞狀態的線程
interrupt方法是在Thread類中的一個普通方法,由對象調用該方法
方法:
boolean isInterrupted():判斷線程是否發生中斷,true:表示中斷 false:非中斷
interrupt():中斷方法
方法特點:
interrupt方法執行是對中斷標志位做了修改
1、如果線程當前是可中斷的阻塞狀態(調用sleep、join、wait等方法會導致線程進入到阻塞狀態:WAITING/TIMED_WAITING/BLOCKED),
在任意的其他線程調用t.interrupt方法,那么線程會立即拋出一個InterruptedException異常,退出阻塞狀態
2、如果線程t當前存儲于運行狀態,則調用t.interrupt()方法,線程會繼續執行,直到發生了阻塞(調用sleep、join、wait)后立即拋出異常,跳出阻塞狀態,Interrupt并不會終止處于“運行狀態”的線程,其僅僅是對標志位做了修改
deamon:守護線程
方法:
//void setDaemon(boolean on) 設置守護線程 參數:true:設置為守護線程 false:非守護線程。默認false
// boolean isDaemon() 判斷當前線程是否是守護線程:true:表示守護線程 false:用戶線程
java中有兩種線程,用戶線程和守護線程,可以通過isDaemon()來區分線程是否是守護線程
用戶線程一般是用來執行用戶級任務
守護線程也稱之為“后臺線程”,服務于用戶線程,一般用來執行后臺任務 例如“:垃圾回收線程是單獨用來處理無用對象的回收的, 負責垃圾回收的線程就是守護線程
守護線程的生命周期:
守護線程的生命周期是依賴于用戶線程,當用戶線程存在,守護線程就會存活,當用戶線程生命終止,守護線程的也會隨之消亡
Priority:線程優先級
線程優先級:指導線程的執行的先后順序的
方法:
//int getPriority() 獲取線程的優先級
//setPriority(int newPriority) 設置線程優先級 newPriority必須在1~10之間的整的,默認的是5
優先級特點:
1、java線程的優先級并不絕對,他所控制的是執行的優先機會,優先級的決定權在操作系統,java設置的優先級只能是被優先執行的概率會高一些,并不絕對
2、java中優先級共有10級,分為1-10,數值越大,表明優先級越高,一般普通的線程優先級是5
3、優先級具有繼承性,如果一個線程B在另一個線程A中創建出來,那么線程B的優先級和線程A保持一致
總結
- 上一篇: 基础网络总结
- 下一篇: Mybatis使用总结