1. 程式人生 > 其它 >JAVA Join+執行緒優先順序+守護程序

JAVA Join+執行緒優先順序+守護程序

Join

  • Join合併執行緒,帶此執行緒執行完成後,在執行其他執行緒,其他執行緒阻塞
  • 可以想象成插隊
package com.xiancheng.demo02;

//測試join方法,想象為插隊。
public class TestJoin implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("執行緒vip來了"+i);
        }
    }


    public static void main(String[] args) throws InterruptedException {

        //啟動我們的執行緒
        TestJoin testJoin = new TestJoin();
        Thread thread = new Thread(testJoin);
        thread.start();



        //主執行緒
        for (int i = 0; i < 1000; i++) {
            if (i == 200) {
                thread.join();//插隊

            }
            System.out.println("main"+i);
        }
    }
}

執行緒狀態觀察

  • Thread.State

​ 執行緒狀態。執行緒可以處於一下狀態之一:

  • NEW

    尚未啟動的執行緒處於此狀態

  • RUNNABLE

    在Java虛擬機器中執行的執行緒處於此狀態

  • BLOCKED

    被阻塞等待監視器鎖定的執行緒處於此狀態

  • WAITING

    正在等待監視器鎖定的執行緒處於此狀態

  • TIMED_WAITING

    正在等待另一個執行緒執行動作達到指定等待時間的執行緒處於此狀態

  • TERMINATED

    已退出的執行緒處於此狀態

一個執行緒可以在給定時間處於一個狀態。這些狀態是不反映任何作業系統執行緒狀態的虛擬機器狀態

package com.xiancheng.demo02;

//觀察測試執行緒的狀態
public class TestState {

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(()->{
            for (int i = 0; i < 5; i++) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("//////////");
        });



        //觀察狀態
        Thread.State state = thread.getState();
        System.out.println(state);//NEW



        //觀察啟動後
        thread.start();//啟動執行緒
        state = thread.getState();
        System.out.println(state);//RUN


        while(state !=Thread.State.TERMINATED){//只要執行緒不中止,就一直輸出狀態
            Thread.sleep(100);
            state = thread.getState();//更新執行緒狀態
            System.out.println(state);//輸出執行緒狀態


        }


        thread.start();



    }

}

執行緒優先順序

  • Java提供一個執行緒排程器來監控程式中啟動後進入就緒狀態的所有執行緒,執行緒排程器按照優先順序決定應該排程那個執行緒來執行.

  • 執行緒的優先順序用數字表示,範圍從1~10

    • Thread.MIN_PRIORITY = 1;
    • Thread.MAX_PRIORITY = 10;
    • Thread.NORM_PRIORITY = 5;
  • 使用一下方式改變或獲取優先順序

    • getPriority().setPriority(int xxx)

優先順序的設定建議在start()排程前

package com.xiancheng.demo02;

//測試執行緒的優先順序
public class TestPriority {
    public static void main(String[] args) {
        //主執行緒預設優先順序
        System.out.println(Thread.currentThread().getName()+"-->"+Thread.currentThread().getPriority());

        MyPriority myPriority = new MyPriority();



        Thread t1 = new Thread(myPriority);
        Thread t2 = new Thread(myPriority);
        Thread t3 = new Thread(myPriority);
        Thread t4 = new Thread(myPriority);
        Thread t5 = new Thread(myPriority);
        Thread t6 = new Thread(myPriority);


        //先設定優先順序,在啟動
        t1.start();

        t2.setPriority(1);
        t2.start();

        t3.setPriority(4);
        t3.start();

        t4.setPriority(Thread.MAX_PRIORITY);//MAX_PRIORITY=10
        t4.start();
        
    }
}


class MyPriority implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"-->"+Thread.currentThread().getPriority());
    }
}

守護(daemon)執行緒

  • 執行緒分為使用者執行緒守護執行緒

  • 虛擬機器必須確保使用者執行緒執行完畢

  • 虛擬機器不用等待守護執行緒執行完畢

  • 如:後臺記錄操作日誌,監控記憶體,垃圾回收等待......

package com.xiancheng.demo02;

//測試守護執行緒
//上帝守護你
public class TestDemo {
    public static void main(String[] args) {
        God god = new God();
        Your your = new Your();


        Thread thread = new Thread(god);
        thread.setDaemon(true);//預設是false表示是使用者執行緒,正常的執行緒都是使用者執行緒...


        thread.start();//上帝守護執行緒啟動

        new Thread(your).start();//你  使用者執行緒啟動...

    }

}


//上帝
class God implements Runnable{
    @Override
    public void run() {
        while (true){
            System.out.println("上帝保佑著你");
        }
    }
}


//你
class Your implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 36500; i++) {
            System.out.println("你一生都開心的活著");
        }
        System.out.println("======goodbey! world======");//Hello,world!
    }
}


你離開了這個世界,守護程序還跑了一會,因為虛擬機器停止還需要一些時間,然後守護程序也就結束了。

人生不過三萬天,都要好好的活著喲。

執行緒同步

多個執行緒操作同一個資源

  • 併發:同一個物件多個執行緒同時操作
  • 顯示生活中,我們會遇到“同一個醫院,多個人都想使用”的問題,比如,食堂排隊打飯,每個人都想吃飯,嘴甜飯的解決方法就是,排隊,一個一個來
  • 處理多執行緒問題時,多個執行緒訪問同一個物件,並且某些執行緒還想修改這個物件,這時候我們就需要執行緒同步。執行緒同步其實就是一種等待機制,多個需要同時訪問此物件的執行緒,進入這個物件等待池形成佇列,等待前面執行緒使用完畢,下一個執行緒再使用。(併發!!)