天天看點

Java多線程(2)--API中建立線程的兩種方式

Java語言的JVM允許程式運作多個線程,它通過java.lang.Thread類來展現。

Thread類的特性

每個線程都是通過某個特定Thread對象的run()方法來完成操作的,經常把run()方法的主體稱為線程體,通過該Thread對象的start()方法來啟動這個線程,而非直接調用run()。

JDK1.5之前建立新執行線程有兩種方法:

①繼承Thread類的方式 (點選檢視Thread類相關常用的方法)

②實作Runnable接口的方式

方式一:繼承Thread類

①定義子類繼承Thread類。

②子類中重寫Thread類中的run方法。

③建立Thread子類對象,即建立了線程對象。

④調用線程對象start方法:啟動線程,調用run方法。

繼承Thread的子類MyThread

public class MyThread extends Thread{
    @Override
    public void run() { //該方法體即為該線程要執行的程式
        for (int i = 0;i < 50;i++){
            if (i % 2 == 0) System.out.println(i);
        }
    }
}
           

建立線程對象并執行

public class TestThread {
    public static void main(String[] args) {
    
    	//建立線程
        MyThread thread = new MyThread();
        //啟動該線程,并執行run()方法
        thread.start();
        
        //以下是不同于thread的線程
        for (int i = 0; i < 50; i++) {
            if (i % 2 == 0) {
                System.out.println(i + "#####");
            }
        }
    }
}
           

結果(僅截取部分)

Java多線程(2)--API中建立線程的兩種方式
Java多線程(2)--API中建立線程的兩種方式

該結果随着計算機的不同會有不同的情況,不定。但要表達的意思就是多線程執行的情況下不同線程是并行的。

Java多線程(2)--API中建立線程的兩種方式

注意點:

①如果自己手動調用run()方法,那麼就隻是普通方法,沒有啟動多線程模式。

②run()方法由JVM調用,什麼時候調用,執行的過程控制都有作業系統的CPU排程決定。

③啟動多線程,必須通過調用start()方法。

④一個線程對象隻能調用一次start()方法啟動,如果重複調用了,則将抛出異常“IllegalThreadStateException”。

方式二:實作Runnable接口

①定義子類,實作Runnable接口。

②子類中重寫Runnable接口中的run方法。

③通過Thread類含參構造器建立線程對象。

④将Runnable接口的子類對象作為實際參數傳遞給Thread類的構造器中。

⑤調用Thread類的start方法:開啟線程,調用Runnable子類接口的run方法。

實作Runnable接口的類

public class MThread implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0){
                System.out.println(i);
            }
        }
    }
}
           

建立對象并執行

public class TestThread {
    public static void main(String[] args) {
        MThread thread = new MThread();
        Thread curThread = new Thread(thread);
        curThread.start();
    }
}
           

繼承方式和實作方式的聯系與差別

開發中:優先選擇:實作Runnable 接口的方式

原因:①實作的方式沒有類的單繼承性的局限性。②實作的方式更适合來處理多個線程有共享資料的情況。

聯系: public class Thread implements Runnable

相同點:兩種方式都需要重寫run(),将線程要執行的邏輯寫在在run()中。