Java之自定義執行緒的2種方式

鄭清發表於2018-08-27

程式:存放在電腦硬碟上的命令集合。  是靜態的
程式:是程式執行之後,在記憶體中產生的資料。
執行緒:組成程式的最小單位。
     比如:程式是執行100行的程式碼效果,執行緒是1行的程式碼的效果

     每一個程式都是由N個執行緒組成的,至少由1執行緒組成

如何自定義執行緒?

第一種方式:繼承Thread類
     1.建立自定義執行緒類  繼承 Thread類
     2.在自定義執行緒類中 覆寫run方法
     3.建立自定義執行緒類物件
     4.啟動執行緒    呼叫start方法


注意事項:
①run方法 與 start方法 的區別
       run :   順序執行執行緒(沒有併發效果)    直接執行不由CPU排程     達不到併發的效果   即執行完run方法才會往下執行
      start: 啟動執行緒    把方法載入執行緒排程池中,由CPU分配時間片來執行執行緒 (有併發效果)
②start方法不能重複呼叫  ==》否則丟擲異常
③主執行緒:主方法由JVM的主執行緒呼叫
④在主執行緒與在主方法中建立的執行緒,在執行之後是完全獨立的,沒有關係  
⑤ 執行java程式之後,至少有幾個執行緒?
            兩個:主執行緒  +  垃圾回收執行緒(守護執行緒)

啟動兩個執行緒,CPU會在兩個執行緒之間高速切換,看到的效果就是同時執行,其實2個執行緒是在以非常快的速度交替執行

第二種方式:實現Runnable介面
     1.建立自定義類 並實現 Runnable介面
     2.覆寫run方法
     3.建立自定義類物件
     4.建立Thread類物件    ==》 呼叫Thread的構造方法:Thread(Runnable r),把上面建立的自定義類物件作為構造方法的引數  
              該物件包含了建立Runnable實現類物件
              該實現類物件已經覆寫了run方法
              該Thread物件,本身就有start方法

     5.啟動執行緒  ==》呼叫Thread物件的start ,(CPU執行該Thread物件的run方法,從Runnable介面的實現類物件來的)

那麼兩種方式,哪一種更好?
      第二種方式更好      ==》  原因:java是單繼承語言,使用繼承,就不能繼承其他類了 ==> 在以後專案需要增加功能的時候,使用第二種方式,它的擴充套件性更強


方式1:

public class Demo {
	public static void main(String[] args) {
		//3.建立執行緒物件
		A a= new A();
		B b = new B();
		//4.啟動執行緒
		a.start();
		b.start();
	}
}
//1.自定義執行緒類   繼承Thread類
class A extends Thread{
	//2.覆寫run方法
	public void run() {
		for(int i=0;i<100;i++){
			System.out.println("AAA ...");
		}
	}
}
//1.自定義執行緒類   繼承Thread類
class B extends Thread{
	//2.覆寫run方法
	public void run() {
		for(int i=0;i<100;i++){
			System.out.println("BBB ...");
		}
	}
}

執行結果圖:  (我們會發現 A和B 在交替出現)


方式2:

public class Demo {
	public static void main(String[] args) {
        //3.建立自定義類物件
		MyThread1 m1 = new MyThread1();
		MyThread2 m2 = new MyThread2();
		/*
		 * 自定義類物件m1和m2 : 負責覆寫run方法
		 * Thread物件t1和t2  : 負責啟動執行緒
		 */
        //4.建立Thread類物件
		Thread t1 = new Thread(m1);
		Thread t2 = new Thread(m2);
        //5.啟動執行緒
		t1.start();
		t2.start();
	}
}

//1.建立自定義類 實現 Runnable介面
class MyThread1 implements Runnable{

    //2.覆寫run方法
	public void run() {
		for(int i=0;i<100;i++){
			System.out.println("... 111 ...");
		}
	}
	
}

//1.建立自定義類 實現 Runnable介面
class MyThread2 implements Runnable{

	//2.覆寫run方法
	public void run() {
		for(int i=0;i<100;i++){
			System.out.println("... 222 ...");
		}
	}
	
}

執行結果圖:(和方式1相同,結果都是交替列印的)

相關文章