執行緒的狀態和常見方法
阿新 • • 發佈:2020-07-09
一、執行緒的狀態:
新建狀態(NEW):執行緒剛被建立,還沒被啟動。
Runable狀態:執行緒物件呼叫start方法,被執行緒排程器來執行。
1.就緒狀態(Ready):執行緒被啟動,加入CPU等待佇列,等待CPU執行。
2.執行狀態(Running):在CPU上執行。
結束狀態(Terminated):執行緒正常結束。執行緒正常結束以後,不能再次呼叫start方法,會丟擲異常:java.lang.IllegalThreadStateException
TimedWaiting等待、Waiting等待、Blocked阻塞
測試執行緒狀態:
publicclass T04_ThreadState { static class MyThread extends Thread { @Override public void run() { System.out.println("---state1:" + this.getState()); for (int i = 0; i < 10; i++) { try { Thread.sleep(500); } catch(InterruptedException e) { e.printStackTrace(); } } } } public static void main(String[] args) { MyThread t1 = new MyThread(); System.out.println("-----state2:"+t1.getState()); t1.start(); //啟動執行緒 try { t1.join();//main方法等待執行緒結束 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("-----state3:"+t1.getState()); } }
二、執行緒常見的幾種方法:
1.Sleep:執行緒睡眠,暫停一段時間讓給其他執行緒去執行,到時間後復活
/** * 執行緒睡眠,暫停一段時間讓給其他執行緒去執行,到時間後復活 */ static void testSleep(){ new Thread(()->{ for (int i = 0; i < 20; i++){ System.out.println("-------->T"+i); if(i % 5 == 0){ try { TimeUnit.MILLISECONDS.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); }
2.Yield:執行緒回到等待佇列,等待再次被排程
/** * yield():執行緒回到等待佇列,等待再次被排程 */ static void testYield(){ new Thread(()->{ for (int i = 1; i < 101; i++){ System.out.println("-------->A"+i); if(i % 10 == 0){ Thread.yield(); } } }).start(); new Thread(()->{ for (int i = 0; i < 100; i++){ System.out.println("-------->B"+i); if(i % 10 == 0){ Thread.yield(); } } }).start(); }
3.Join:當前執行緒加入呼叫join方法的執行緒,本執行緒等待,等A執行完了以後,B繼續執行。
/** * join(): 當前執行緒加入呼叫join方法的執行緒,本執行緒等待,等A執行完了以後,B繼續執行。 */ static void testJoin(){ Thread t1 = new Thread(()->{ for (int i = 0; i < 100; i++) { System.out.println("------>A0"+i); } }); t1.start(); new Thread(()->{ for (int i = 0; i < 100; i++){ if(i == 4){ try { t1.join(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("B0"+i); } }).start(); }
執行結果如下: