package cn.learn.thread.Thread; /* 實現Runnable必須重寫run()方法,一般推薦用Runnable實現 */ public class RunnableImpl implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName()+"執行"); } }
package cn.learn.thread.Thread; /* 繼承Thread類,實現多線程 實現步驟: 1.創建一個Thread類的子類 2.在Thread的子類中重寫Thread類中的run方法設置線程任務 3.創建Thread的子類對象 4.調用Thread類中的start方法,開啟新的線程,執行run方法 結果是兩個線程並發地運行,當前線程(main線程)和另外一個線程(執行其run方法) 多次啟動一個線程是非法的,特別線程結束后,不能重新啟動 java屬於搶占式執行,哪個線程級別高就優先執行;同一個優先級隨機選擇 */ public class ThreadExtends extends Thread { public ThreadExtends() { } //使用父類來創建新線程名稱 public ThreadExtends(String name) { super(name); } //重新run方法 @Override public void run() { //獲取線程名稱 //String name = this.getName(); //System.out.println("線程名稱:"+name); //獲取當前線程名稱 Thread thr = Thread.currentThread(); System.out.println(thr); //鏈式編程 //System.out.println(Thread.currentThread().getName()); } }
1 package cn.learn.thread.Thread; 2 /* 3 JVM執行main方法,找OS開辟一條main方法通向cpu的路徑 4 這個路徑叫main線程-主線程 5 cpu通過該線程,路徑就可以執行main方法 6 7 Thread繼承與Runnable接口實現的區別 8 實現Runnable接口創建多線程的好處: 9 1.避免了單繼承的局限性 10 2.增強了程序的擴展性,降低了耦合性(解耦),eg:多個Runnable的實現類可以有不同的線程任務 11 3.多個Thread對象,共用一個Runnable實現類對象的資源 12 */ 13 14 public class MyThread { 15 public static void main(String[] args) throws InterruptedException { 16 //創建Thread類的子類對象,如ThreadExtends有構造方法可在其類用super(name)父類來創建線程名稱 17 ThreadExtends anThread = new ThreadExtends(); 18 19 //可以用anThread.setName();來設置線程名稱 20 21 //開辟新線程,用於執行run方法,如果直接使用run方法,還是單線程,由main方法來執行 22 anThread.start(); //開辟新的棧空間,新線程,ThreadExtends類中run方法運行,獲取線程名稱Thread-0 23 24 //再創建一個新線程,運行run(),獲取線程名稱Thread-1 25 new ThreadExtends().start(); //Thread[Thread-1,5,main] 26 27 //獲取當前線程名稱 28 System.out.println(Thread.currentThread().getName()); //main 29 30 //與上面的線程並發執行,不安全,搶占cpu,cpu有選擇的權利,隨機執行 31 for (int i = 0; i <10 ; i++) { 32 System.out.println("main"+i); 33 } 34 35 36 //Thread的sleep暫時以指定毫秒數停止執行線程,結束后繼續執行 37 //模擬秒表 38 for (int i = 0; i <60 ; i++) { 39 Thread.currentThread().sleep(1000); 40 System.out.println(i); 41 42 } 43 44 45 //創建線程的第二種方法 46 /* 47 創建線程的另一種方法是聲明實現 Runnable 接口的類。 48 該類然后實現 run 方法。然后可以分配該類的實例,在創建 Thread 時作為一個參數來傳遞並啟動。 49 50 需要用Thread來接受其對象,調用start,運行run開啟新線程 51 */ 52 //1 53 RunnableImpl runnableThread = new RunnableImpl(); 54 //2,多個Thread共用一個runnableThread資源 55 Thread t=new Thread(runnableThread); 56 Thread t1=new Thread(runnableThread); 57 //3 58 t.start(); //新線程開啟 59 t1.start(); //新線程開啟 60 61 } 62 }
