建立執行緒知識點總結

Biggie Twist發表於2020-11-27

1.主執行緒:執行主(main)方法的執行緒
單執行緒程式:java程式中只有一個執行緒,執行從main方法開始,從上到下依次執行,JVM執行main方法,main方法會進入到棧記憶體,JVM會找作業系統開闢一條main方法通向CPU的執行路徑,CPU就可以通過這個路徑來執行main方法,而這個路徑就叫main(主)執行緒。

2.建立多執行緒程式的第一種方式:建立Thread類的子類
Thread類:是描述執行緒的類,我們想要實現多執行緒程式,就必須繼承Thread類

實現步驟:
    1.建立一個Thread類的子類
    2.在Thread類的子類中重寫Thread類中的run方法,設定執行緒任務(開啟執行緒要做什麼?)
    3.建立Thread類的子類物件
    4.呼叫Thread類中的star方法,開啟新的執行緒,執行run方法
        結果是兩個執行緒併發執行,當前執行緒(main執行緒)和另一個執行緒(建立的新執行緒,執行其run方法)
        多次啟動一個執行緒是非法的,特別是當執行緒執行結束後,不能再重新啟動

java屬於搶佔式排程,哪個執行緒優先順序高,哪個執行緒優先執行,同一個優先順序,隨機一個執行

3.建立多執行緒程式的第二種方式:實現Runnable介面

實現步驟:
    1.建立一個Runnable介面的實現類
    2.在實現類中重寫Runnable介面的run方法,設定執行緒任務
    3.建立Runnable介面的實現類物件
    4.建立Thread物件,構造方法中傳遞Runnable介面的實現類物件
    5.呼叫Thread類中的start方法,開啟新的執行緒,執行run方法

實現Runnable介面建立多執行緒的好處:
    1.避免了單繼承的侷限性
        一個類只能繼承一個類(一個人只能有一個親爹),類繼承了Thread類就不能繼承其他類
        實現了Runnable介面還可以繼承其他類,實現其他的介面
    2.增強了程式的擴充套件性,降低了程式的耦合性(解耦)
        實現Runnable介面的方式,把設定執行緒任務和開啟新執行緒進行了分離
        實現類中,重寫run方法:用來設定執行緒任務
        建立Thread類物件呼叫start方法:用來開啟新執行緒
  1. 匿名內部類方式實現執行緒的建立

    匿名:沒有名字
    內部類:寫在其他類內部的類

    匿名內部類作用:簡化程式碼
    把子類繼承父類,重寫父類的方法,建立子類物件合成一步完成
    把實現類實現介面,重寫介面中的方法,建立實現類的物件合成一步完成

    匿名內部類最終產物:子類/實現類物件,而這個類沒有名字

    格式:
    new 父類/介面(){
    重複父類/介面中的方法
    }
    1).

//執行緒的父類是Thread
        //new MyThread().start();
        new Thread(){
          //重寫run方法,設定執行緒任務
            @Override
            public void run() {
                for (int i = 0; i < 20; i++) {
                    System.out.println(Thread.currentThread().getName()+"-->"+"程式猿");
                }
            }
        }.start();

2).

  new Thread(new Runnable(){
            //重寫run方法,設定執行緒任務
            @Override
            public void run() {
                for (int i = 0; i < 20; i++) {
                    System.out.println(Thread.currentThread().getName()+"-->"+"程式設計師");
                }
            }
        }).start();
  1. 進入到TimeWaiting(計時等待)的兩種方式
    1.使用sleep(long m)方法,在毫秒值結束之後,執行緒睡醒進入到Runnable/Blocked狀態
    2.使用wait(long m)方法,wait方法如果在毫秒值結束之後,還沒有被notify喚醒,就會自動醒來,執行緒睡醒進入到Runnable/Blocked狀態

    喚醒的方法:
    notify(),喚醒在此物件監視器上等待的單個執行緒
    notifyAll(),喚醒在此監視器上等待的所有執行緒
    例:

//建立鎖物件保證唯一
        Object obj=new Object();
        //建立一個顧客執行緒
        new Thread(new Runnable() {
            @Override
            public void run() {
                //保證等待和喚醒只能有一個在執行
                synchronized (obj){
                    System.out.println("告知老闆要的包子種類和數量");
                    //呼叫wait方法,放棄cpu的執行,進入到WAITTING狀態
                    try {
                        obj.wait(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //喚醒之後執行的程式碼
                    System.out.println("包子開吃");
                }
            }
        }).start();

相關文章