可以透過Thread.getState 方法取得執行緒的狀態(執行緒一共有6 種狀態)
NEW(新建)new:尚未啟動
RUNNABLE(可運作狀態)runnable:正在JVM 中運作;或是正在等待作業系統的其他資源(例如處理器)
//有些程式語言會把RUNNABLE分成2種情況
//1.running
/ /2.ready
//以上2種在Java中都屬於RUNNABLE
BLOCKED(阻塞狀態) blocked:正在等待監視器鎖(內部鎖定)
#WAITING (等待狀態) waiting:在等待另一個執行緒
呼叫下列方法會處於等待狀態
#沒有超時值的Object.wait
沒有超時值的Thread.join
LockSupport.park
//後續會詳細介紹
TIMED_WAITING(定時等待狀態) timed_waiting
呼叫以下方法會處於定時等待狀態
Thread.sleep
有超時值的Object.wait
有超時值的Thread.join
LockSupport.parkNanos
#LockSupport. parkUnti
//後續會詳細介紹
TERMINATED(終止狀態):已經執行完畢
部分實例:
public class Main { public static void main(String[] a) { Thread dangqian = Thread.currentThread();//获取主线程 System.out.println(dangqian.getState());//输出RUNNABLE //表示主线程正处于RUNNABLE状态 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(); //启动执行完run方法后线程终止 此时处于TERMINATED状态 } }
sleep interrupt 介紹
可以透過Thread.sleep 方法暫停目前線程,進入WAITING狀態
在暫停期間,若呼叫線程物件的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是静态方法,所以通过类名来调用;让线程睡3s }catch (InterruptedException e) { e.printStackTrace(); } System.out.println("2"); } }); tj.start(); //因为是多线程,在执行tj线程时,主线程依然往下走 try { Thread.sleep(1000);//让主线程睡1s } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("3"); //由于tj线程睡得较久,所以先打印3,再打印2 tj.interrupt();//中断此线程,但实际上只是给线程设置一个中断标志,线程仍会执行;在这里用于触发异常 } }
輸出:
1
3
2
join isAlive 介紹
A.join 方法:等執行緒A 執行完畢後,目前執行緒再繼續執行任務。可以傳參指定最長等待時間
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是静态方法,所以通过类名来调用;让线程睡3s }catch (InterruptedException e) { e.printStackTrace(); } System.out.println("2"); } }); tj.start(); System.out.println(tj.isAlive());//此时3s未过,tj线程仍在执行;所以输出true try { tj.join();//等tj线程执行完毕再往下执行 //tj.join(1000); 等待tj线程1s再往下执行 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("3"); System.out.println(tj.getState()); System.out.println(tj.isAlive());//tj线程已执行完毕;所以输出false } }
輸出:
#true
1
2
3
TERMINATED
false
以上是Java 執行緒的狀態與常用方法分析及範例的詳細內容。更多資訊請關注PHP中文網其他相關文章!