1. 程式人生 > >一 java------執行緒---執行緒的建立

一 java------執行緒---執行緒的建立

一:執行緒的建立(繼承Thread類方式)  需求: 龜兔賽跑----建立兩個執行緒,一個執行緒命名為兔子Rabbit  一個執行緒名稱為烏龜Tortoies  技能: 建立執行緒並啟動執行緒  1.建立執行緒的方式,有兩種,一種是繼承Thread類,一種是實現Runnable介面  2.繼承Thread類----Thread類     2.1 Thread類的定義         執行緒 是程式中的執行執行緒。Java 虛擬機器允許應用程式併發地執行多個執行執行緒。     2.2 關於繼承關係,如果一個子類繼承了Thread類,那麼此子類也就是一個執行緒類了! 所以建立的子類物件,也就是執行緒物件。         分析: 龍生龍,鳳生鳳,老鼠天生會打洞!         模式:             class 子類名稱 extends Thread {                //重寫run()方法                public void run(){                // 此方法時執行緒的主體,把核心程式碼放入到此方法中!                   執行程式碼                  }                           }      2.3 實現Runnable介面---此介面只有一個抽象方法  run()            發現:如果一個子類實現一個介面,此介面如果存在抽象方法,則子類必須重寫!            發現:Thread類和Runnable直接的關係-----實現關係  Thread類實現了Runnable介面                  Thread類的構造方法----兩個比較重要的                                         public Thread(Runnable r);                  public Thread (Runnable r, String name)            模式:               class 子類名稱 implements Runnable {                  //重寫run()方法                  public void run(){                     // 此方法時執行緒的主體,把核心程式碼放入到此方法中!                     執行程式碼                  }                           }                   3.執行緒的啟動,是呼叫run()方法還是start()方法?          3.1 如果建立的執行緒物件,呼叫的是run()方法,那麼只會把run方法看成是一個普通方法進行執行。              所以,不要直接呼叫run()方法!          3.2 如果呼叫的是start()方法,根據API的解釋,JVM會在後臺自動的去呼叫run()方法              所以,啟動執行緒是呼叫start()方法                       3.3 發現:在兔子執行緒當中,啟動之後呼叫run(),如果run()方法裡面嵌套了一個while死迴圈                   兔子執行緒一直在執行-----烏龜執行緒有機會執行嗎?不會執行的          3.4 main方法也是一個執行緒,而且是主執行緒  程式碼區:  public class Rabbit extends Thread{      //為什麼不是屬性而是使用構造方法呢?因為在父類Thread類當中有一個構造方法,public Thread(String name)   public Rabbit(){   }   public Rabbit(String name){    super(name);   }   //重寫run方法   public  void  run(){    //既然說run方法是執行緒的主題,把核心程式碼放入到此方法中!    while(true){     System.out.println(Thread.currentThread().getName()+"------領先了");    }   }  }  public class Tortoies extends Thread{   //構造方法   public Tortoies(){   }      public Tortoies(String name){    super(name);   }   public void run(){    while(true){     //把核心程式碼放入到此方法中     System.out.println(Thread.currentThread().getName()+"------領先了");    }    }  }  public class ThreadTest1 {   public static void main(String[] args) {    //開始建立執行緒      Rabbit  r = new Rabbit();      Tortoies t = new Tortoies();    //為執行緒命名      /**       * setName()       * getName()       * Thread.currentThread()       * 都是Thread類的方法,子類通過繼承可以呼叫       */      r.setName("兔子");      t.setName("烏龜");    //啟動執行緒      r.start();      t.start();   }  }  二:執行緒的建立(實現Runnable介面方式)  需求: 大運動會上,運動員進行賽跑----男超人和女超人  技能: 建立執行緒並啟動執行緒----實現Runnable介面  問題1: 啟動執行緒是呼叫start方法,那麼Runnable介面只有一個run()方法,沒有start方法,怎麼啟動執行緒?  解決1: 誰有start()方法?---Thread類裡面存在一個start方法 ---- 可以藉助Thread類          發現: Thread類的構造方法                public Thread(Runnable r)               public Thread(Runnable r,String name)                  問題2: 建立多個執行緒,由於併發機制,執行緒的啟動以及執行,顯得毫無規律    原因2: 執行緒的隨機性太強---- 體現出各個執行緒在搶CPU資源,如果那個執行緒搶到了那麼那個執行緒執行,可能有的執行緒一次也不會搶到。    解決2: 可以使用同步鎖    問題3: 發現建立執行緒的方式有兩種,兩者建立執行緒的區別?          繼承Thread類             優點: 簡單             缺點: 由於單繼承的執行緒,無法繼承其他的類          實現Runnable介面             優點: 可以繼承其它類,多執行緒可共享同一個Runnable物件  程式碼區:  public class SuperMan extends Object implements Runnable {  // String name;   //構造方法以及屬性,寫還是不寫? 不寫啦,原因如下:   /*    * 1.如果一個類,沒有定義任何的構造方法,則JVM會預設的配一個孔參構造方法    * 2.建立有參構造方法    *     2.1 通過父類獲取---super(name),發現:SuperMan子類實現的是Runnable介面,不是Thread類    *     2.2 因為Thread類裡面的構造方法---public Thread(Runnable r,String name)    */   @Override   public void run() {    //run方法---執行緒的主題,把核心程式碼放入到此方法中  //  while(true){    for(int i=1;i<=20;i++){     System.out.println(Thread.currentThread().getName()+"領先了......");    }   }  }  public class SuperWoman implements Runnable {   @Override   public void run() {  //  while(true){    for(int i=1;i<=20;i++){     System.out.println(Thread.currentThread().getName()+"領先了");    }   }  }  public class ThreadTest2 {   public static void main(String[] args) {    //1.建立Runnable介面物件,目的: 建立執行緒物件        Runnable r1 = new SuperMan();  //      Runnable r2 = new SuperWoman();    //2.如果實現Runnable介面,來建立執行緒物件,則離不開Thread類        Thread t1 = new Thread(r1,"高宇");        Thread t2 = new Thread(r1,"王夢凡");    //3.啟動執行緒        t1.start();        t2.start();   }  }