1. 程式人生 > 實用技巧 >執行緒的狀態和常見方法

執行緒的狀態和常見方法

一、執行緒的狀態:

  新建狀態(NEW):執行緒剛被建立,還沒被啟動。

  Runable狀態:執行緒物件呼叫start方法,被執行緒排程器來執行。

    1.就緒狀態(Ready):執行緒被啟動,加入CPU等待佇列,等待CPU執行。

    2.執行狀態(Running):在CPU上執行。

  結束狀態(Terminated):執行緒正常結束。執行緒正常結束以後,不能再次呼叫start方法,會丟擲異常:java.lang.IllegalThreadStateException  

  TimedWaiting等待、Waiting等待、Blocked阻塞

  測試執行緒狀態:

  

public
class 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();
    } 

執行結果如下: