Java?詳細講解線程的狀態(tài)及部分常用方法
可以通過 Thread.getState 方法獲得線程的狀態(tài)(線程一共有 6 種狀態(tài))
NEW(新建)new:尚未啟動
RUNNABLE(可運行狀態(tài))runnable:正在 JVM 中運行;或者正在等待操作系統(tǒng)的其他資源(比如處理器)
//有些編程語言會把RUNNABLE分成2種情況
//1.running
//2.ready
//以上2種在Java中都屬于RUNNABLE
BLOCKED(阻塞狀態(tài)) blocked:正在等待監(jiān)視器鎖(內部鎖)
WAITING(等待狀態(tài)) waiting:在等待另一個線程
調用以下方法會處于等待狀態(tài)
沒有超時值的 Object.wait
沒有超時值的 Thread.join
LockSupport.park
//后續(xù)會詳細介紹
TIMED_WAITING(定時等待狀態(tài)) timed_waiting
調用以下方法會處于定時等待狀態(tài)
Thread.sleep
有超時值的 Object.wait
有超時值的 Thread.join
LockSupport.parkNanos
LockSupport.parkUnti
//后續(xù)會詳細介紹
TERMINATED(終止狀態(tài)):已經(jīng)執(zhí)行完畢
部分實例:
public class Main { public static void main(String[] a) { Thread dangqian = Thread.currentThread();//獲取主線程 System.out.println(dangqian.getState());//輸出RUNNABLE //表示主線程正處于RUNNABLE狀態(tài) Thread tj = new Thread();//新建1個線程 System.out.println(tj.getState());//輸出NEW Thread tj1 = new Thread(new Runnable() { @Override public void run() { System.out.println("ACM"); } }); tj1.start(); //啟動執(zhí)行完run方法后線程終止 此時處于TERMINATED狀態(tài) } }
- sleep interrupt 介紹
可以通過 Thread.sleep 方法暫停當前線程,進入WAITING狀態(tài)
在暫停期間,若調用線程對象的 interrupt 方法中斷線程,會拋出 java.lang.InterruptedException 異常
實例(注釋)介紹更為明了:
public class Main { public static void main(String[] a) { Thread tj = new Thread(new Runnable() { @Override public void run() { System.out.println("1"); try { Thread.sleep(3000);//sleep是靜態(tài)方法,所以通過類名來調用;讓線程睡3s }catch (InterruptedException e) { e.printStackTrace(); } System.out.println("2"); } }); tj.start(); //因為是多線程,在執(zhí)行tj線程時,主線程依然往下走 try { Thread.sleep(1000);//讓主線程睡1s } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("3"); //由于tj線程睡得較久,所以先打印3,再打印2 tj.interrupt();//中斷此線程,但實際上只是給線程設置一個中斷標志,線程仍會執(zhí)行;在這里用于觸發(fā)異常 } }
輸出:
1
3
2
- join isAlive 介紹
A.join 方法:等線程 A 執(zhí)行完畢后,當前線程再繼續(xù)執(zhí)行任務。可以傳參指定最長等待時間
A.isAlive 方法:查看線程 A 是否還活著
實例:
public class Main { public static void main(String[] a) { Thread tj = new Thread(new Runnable() { @Override public void run() { System.out.println("1"); try { Thread.sleep(3000);//sleep是靜態(tài)方法,所以通過類名來調用;讓線程睡3s }catch (InterruptedException e) { e.printStackTrace(); } System.out.println("2"); } }); tj.start(); System.out.println(tj.isAlive());//此時3s未過,tj線程仍在執(zhí)行;所以輸出true try { tj.join();//等tj線程執(zhí)行完畢再往下執(zhí)行 //tj.join(1000); 等待tj線程1s再往下執(zhí)行 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("3"); System.out.println(tj.getState()); System.out.println(tj.isAlive());//tj線程已執(zhí)行完畢;所以輸出false } }
輸出:
true
1
2
3
TERMINATED
false
到此這篇關于Java 詳細講解線程的狀態(tài)及部分常用方法的文章就介紹到這了,更多相關Java 線程的狀態(tài)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java多線程之并發(fā)工具類CountDownLatch,CyclicBarrier和Semaphore
這篇文章主要為大家介紹了java并發(fā)工具類CountDownLatch,CyclicBarrier和Semaphore ,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2021-12-12MyBatis-Plus實現(xiàn)多表聯(lián)查的方法實戰(zhàn)
這篇文章主要給大家介紹了關于MyBatis-Plus實現(xiàn)多表聯(lián)查的方法,MyBatis Plus是一款針對MyBatis框架的增強工具,它提供了很多方便的方法來實現(xiàn)多表聯(lián)查,需要的朋友可以參考下2023-07-07詳解spring-boot集成elasticsearch及其簡單應用
本篇文章主要介紹了詳解spring-boot集成elasticsearch及其簡單應用,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06mybatis如何設置useGeneratedKeys=true
這篇文章主要介紹了mybatis如何設置useGeneratedKeys=true,具有很好的參考價值,希望對大家有所幫助。2022-01-01