【騏程】多執行緒(上)

CSU-ZC發表於2020-11-14

多執行緒:

1.兩種建立方式


1.1.繼承Thread類:
1.1.1建立方法:
寫一個繼承於Thread類的子類;重寫run方法;建立本類的物件;用物件呼叫start方法。這樣四步驟就建立了多執行緒。
例如:


```java
//1.寫一個繼承於Thread類的子類
public class ThreadThreadTest extends  Thread{
    //2.重寫run方法
    @Override
    public void run() {
        //順便寫一個氣泡排序
        int arr[] = new int[]{10,2,-20,50,5,30};
        System.out.println("排序前為:"+ Arrays.toString(arr));
        for(int i =0;i<arr.length-1;i++){
            for(int j = 0;j<arr.length-i-1;j++){
                if(arr[j] > arr[j+1]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        System.out.println("排完序後為:"+ Arrays.toString(arr));
    }

    public static void main(String[] args) {
        //3.建立本類的物件
        ThreadThreadTest ttt = new ThreadThreadTest();
        //4.呼叫start方法
        ttt.start();
    }

}

## 1.1.2注意事項

①不能直接調run方法,這樣不能啟動執行緒
②需要另外一個執行緒時需要重新new物件去調執行緒(呼叫相同的方法),在繼承類這裡就是要重複建立執行緒。在這裡使用多執行緒就需要使用類建立多物件。
③因為這裡建立的物件可能不止一個,所以如果共享資料的建立物件時就建立了多個那麼就造成了沒有共享資料,大家自己都是自己的資料,所以這時可以把共享的資料用static寫成靜態變數,這樣多個執行緒就可以共享同一個資料了。用static共享一份資料,但是有執行緒安全問題,後面會講解決執行緒安全問題。
繼承的方式解決同步方法要慎用(因為監視器為this,可能不唯一要慎用。)
1.1.3給執行緒命名:
Thread.current方法就可以使用自定義的名字。


## 1.2實現Runnable介面:

建立多執行緒的方式二:實現Runnable介面
建立一個實現Runnable介面的類;重寫run方法;建立實現類的物件;建立Thread類的物件,並把實現類的物件作為引數放入建立的Thread中作為實參;用Thread的物件呼叫start方法。使用這五部既可以建立用實現Runnable的介面的方式建立多執行緒。

```java
//1.建立類實現runnable介面
class MThread implements Runnable{
//2.重寫run方法
    @Override
    public void run() {
        int arr[] = new int[]{10,5,62,-12,3,96,78,50};
        System.out.println("排序前:"+ Arrays.toString(arr));
        for(int i = 0;i<arr.length-1;i++){
            for(int j =0;j<arr.length-i-1;j++){
                if(arr[j]>arr[j+1]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }

            }
        }
        System.out.println(Thread.currentThread().getName()+"排序後:"+Arrays.toString(arr));
    }
}
public class ThreadTest {
    public static void main(String[] args) {
        //3.建立實現類的物件
        MThread mt = new MThread();
        //4.將實現類的物件作為引數傳遞到Thread類的構造器中,建立Thread類的物件
        Thread th1 = new Thread(mt);//此時的執行緒為th1(誰start誰就是執行緒)
        th1.setName("執行緒1:");
        //5.用Thread類呼叫start方法(①啟動執行緒;②呼叫run方法---》呼叫了runnable中target的run方法)
        th1.start();

        //在啟動一個執行緒(共用一個物件)
        Thread th12= new Thread(mt);//此時的執行緒為th1(誰start誰就是執行緒)
        th12.setName("執行緒2:");
        th12.start();
    }
}

1.3、比較兩種建立執行緒的方式

在開發中,優先使用實現Runnable介面的方式
主要有兩種原因:1.實現的方式沒用類的單繼承性;
2.實現的方式更適合來處理多個執行緒共享資料的情況。
對於兩者而言:聯絡:public class Thread implements Runnable
相同點:兩種方式都需要重寫run(),將執行緒要執行的邏輯宣告在run中。

相關文章