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