一 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(); } }