溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

多線程一些基礎實現

發布時間:2020-05-19 08:23:55 來源:網絡 閱讀:294 作者:SerryYang 欄目:編程語言

繼承Thread類方式

1. 線程啟動時:一定是調用Thread類的start()方法,因為通過源碼解析發現,start()方法中,最后會調用以native關鍵字修飾的start0()方法,該方法會通過JVM實現不同操作系統不同實現的

   資源調度分配;

2.  Native關鍵字:調用本機的操作系統函數。


實現Runnable接口方式

1. 實現Runnable接口:由于繼承Thread類會造成單繼承的局限性,所以利用接口來實現;

2. Runnable接口:因為其是函數式接口,所以該接口中只有一個方法,可以使用Lamda表達式完成;

3. @FunctionalInterface:修飾的接口為函數式接口;

4. 由于啟動發多線程只能通過start()方法,但Runnable方法中沒有此方法,故實現該接口并啟動一個線程,是通過Thread的構造函數發現:

   public Thread(Runnable targer) ,所以可以通過此方式來啟動一個多線程;


實例:Runnnable接口方式

public class Test11 {

    public static void main(String[] args) {
        Test11Demo t1 = new Test11Demo("線程1");
        Test11Demo t2 = new Test11Demo("線程2");
        Test11Demo t3 = new Test11Demo("線程3");
        new Thread(t1).start();
        new Thread(t2).start();
        new Thread(t3).start();
    }

}

class Test11Demo implements Runnable {
    
    private String name;
    
    Test11Demo(String name) {
        this.name = name;
    }
    
    @Override
    public void run() {
        for (int x = 0; x < 10; x++) {
            System.out.println(this.name + ",x=" + x);
        }
    }
    
}


實例:Lamda方式,內部類方式

在原來代碼基礎上,添加測試代碼

public static void main(String[] args) throws Exception {
    Test11Demo t1 = new Test11Demo("線程1");
    Test11Demo t2 = new Test11Demo("線程2");
    Test11Demo t3 = new Test11Demo("線程3");
    new Thread(t1).start();
    new Thread(t2).start();
    new Thread(t3).start();

    final String name1 = "Lamda測試";
    new Thread( ()->{
        for (int x = 0; x < 10; x++) {
            System.out.println(name1 + ",x=" + x);
        }
    }).start();


    final String name = "內部類測試";
    new Thread(new Runnable() {
        @Override
        public void run() {
            for (int x = 0; x < 10; x++) {
                System.out.println(name + ",x=" + x);
            }
        }
    }).start();
}


兩種方式,啟動線程的異同

1. 查看源碼可知,Thread類定義:

   public classThread extends Object implements Runnable

2. 類關系圖:

多線程一些基礎實現


綜上,可知,

多線程需要一個線程主類:可以繼承Thread類,也可以實現Runnable接口;

使用Runnable接口,可以更好的實現數據共享的操作;并可以避免Thread類帶來的單繼承局限性;



線程的命名和取得

1. 線程的所有操作方法基本上都已經在Thread類中定義完整;

2. 如下方法,可提供線程名稱操作:

① 構造方法:public Thread(Runnable target,String name)

② 設置名字:public final void setName(String name)

③ 獲取名字:public final String getName()

④ 由于線程執行本身不確定狀態,

提供方法:public static Thread currentThread()來取得當前線程

3. 如果在設置線程對象名稱時,沒有設置具體名字,則會采用默認名字進行定義;

4. 每一個JVM至少會啟動兩個線程:主線程,GC線程;


線程的休眠

休眠方法:sleep();線程的睡眠,是有先后順序的


線程的優先級

1. 優先級操作方法:

設置優先級:public final void setPriority(int newPriority);

取得優先級:public final int getPriority();

2. 優先級相關常量:

   最高優先級:public final static int MAX_PRIORITY = 10;

   中等優先級:public final static int NORM_PRIORITY = 5;

   最低優先級:public final static int MIN_PRIORITY = 1;

3.  理論上,會根據設置的優先級進行線程的啟動運行;

   主線程,屬于一般優先級。


線程的同步與死鎖

1. 同步問題的引出:多個線程需要訪問統一資源;

2. 同步代碼塊執行效率要低于異步,同步代碼塊使用:synchronized關鍵字

3. 異步執行效率高,但數據不準確;同步代碼執行效率慢,但會保證數據的有效性,同時線程安全。

4. 死鎖:(了解) 如果程序中出現過多同步,將會產生死鎖問題;





---下一篇,線程中的生產者與消費者理解--線程的應用場景之一







向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女