java_6 線程建立的方式

1、建立線程的方法

1.繼承Thread類

實現步驟:
(1)建立一個繼承於Thread類的子類
(2)重寫Thread類的run()方法【線程執行的操做聲明在run()中】
(3)建立Thread類的子類的對象
(4)經過此對象調用start()方法【①啓動線程②調用當前線程對象的run方法】
代碼 java

//(1)建立一個繼承於Thread類的子類
class MyThread1 extends Thread{
    public MyThread1(String name){
        super(name);
    }
        //(2)重寫Thread類的run()方法
    @Override
    public void run() {
        System.out.println("第一種建立線程");
        }
    }
}
public class ThreadTest{
    public static void main(String[] args) {
        //(3)建立Thread類的子類的對象
        MyThread1 t1=new MyThread1();
        //(4)經過此對象調用start()方法
        t1.start();
        }
}

2.實現Runnable接口

實現步驟
(1)建立一個實現了Runnable接口的類
(2)該實現類 去實現Runnable中的抽象方法run()
(3)建立實現類的對象
(4)將此對象做爲參數傳遞到Thread類的構造器中,建立 Thread類的對象
【Thread構造方法源碼:public Thread(Runnable target)】
(5)經過Thread類的對象調用start()
代碼 ide

//1.建立一個實現了Runnable接口的類
class MyThread2 implements Runnable{
    @Override
    //2.實現類去實現Runnable中的抽象方法run()
    public void run() {
        System.out.println("第二種建立線程:實現Runnable接口");
            }
     }
         public class ThreadTest1 {
    public static void main(String[] args) {
        //3.建立實現類的對象
        MyThread2 m=new MyThread2();
        // 4.將此對象做爲參數傳遞到Thread類的構造器中,建立Thread類的對象
        Thread thread = new Thread(m);
        // 5.經過Thread類的對象調用start()
         thread.start();

2、說明

在前邊說過start()方法的做用:
(1)啓動線程
(2)調用當前線程的run()方法
那麼問題來了:爲何在使用Runnable接口建立線程的方法中,明明是Thread類的對象調用的start(),爲何最終會是實現Runnable接口的類的run()方法被執行,而不是Thread類的run()方法被執行?
緣由下次再說,要去上課了
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
呼·······,我回來啦!
(1)首先來看一下Thread類的run()方法的源碼:
java_6 線程建立的方式
說明:若是target非空,就執行target的run()方法,那麼target又是什麼?
(2)再來看一下Thread的一個構造方法Thread(Runnable target)
java_6 線程建立的方式
說明:target就是實現了Runnable接口的實現類的實例對象。
由於該對象非空,因此Thread的對象在調用了自身的run()方法,而後發現target對象非空,所以轉而執行了實現類的run()方法。線程

相關文章
相關標籤/搜索