日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线程的状态及方法

發布時間:2025/5/22 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线程的状态及方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 線程的狀態及狀態轉換
    • 線程狀態
      • 新建狀態(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類的靜態方法,不屬于某個對象

//設置休眠的時間,單位是毫秒public static native void sleep(long millis) throws InterruptedException;//設置休眠時間 毫秒和納秒public static void sleep(long millis, int nanos) throws InterruptedException {if (millis < 0) {throw new IllegalArgumentException("timeout value is negative");}if (nanos < 0 || nanos > 999999) {throw new IllegalArgumentException("nanosecond timeout value out of range");}if (nanos >= 500000 || (nanos != 0 && millis == 0)) {millis++;}sleep(millis);}

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并不會終止處于“運行狀態”的線程,其僅僅是對標志位做了修改

Thread thread = new Thread(new Runnable() {@Overridepublic void run() {int i = 0;while (i<10){System.out.println(i++);}try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("睡眠結束");}});thread.start();thread.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保持一致

總結

以上是生活随笔為你收集整理的线程的状态及方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。