都知道要實現多線程有兩種方法1、繼承自Thread類 2、實現Runnable介面
前者很好理解,你想擁有某種性質就簡單的辦法就是繼承它。比如你想很有錢,最簡單的辦法就是你爸是李剛!
由於java是單繼承,但這種方法浪費了唯一的寶貴的一個繼承的機會,顯得很不划算。於是出現了第二種實現
多線程的方法-----實現Runnable介面。這種方式,就顯得不那麼直接了。我不禁去想,為什麼會那麼奇妙呢?
這裡面有包含什麼樣的設計理念呢?這後面隱含了什麼原理呢?我的思考與理解如下:
Thread類就像一個工廠,他可以製造傢具,我們如果想製造傢具,有兩種方法:
一是,自己也學著造一個同樣的工廠,在自己的廠裡面製造傢具。這就相當於把我們的類繼承Thread線程,建立多線程。
二是,我們自己不用開廠,讓Thread廠給我們代加工。工廠貼出告示說可以加工一種叫Runnable的木材(Thread構造方法可以接收Runnable參數),
然後我們就拿著自己的Runnable木材到工廠,讓工廠給代加工,製造傢具。我將這種方式我稱為代加工模式。這樣是不是很爽?自己想要的傢具別人幫忙
製造了。自己可以自由選擇開別的廠(繼承其他的類)。代加工能實現的前提條件是:Thread工廠可以加工Runnable木材,而你自己也有能被Thread工廠加工的
Runnable木材。
兩種建立線程的方式範例程式碼:
/*建立線程方式一:繼承Thread類。步驟:1,定義一個類繼承Thread類。2,覆蓋Thread類中的run方法。3,直接建立Thread的子類對象建立線程。4,調用start方法開啟線程並調用線程的任務run方法執行。可以通過Thread的getName擷取線程的名稱 Thread-編號(從0開始)主線程的名字就是main。*/class Demo extends Thread{private String name;Demo(String name){super(name);//this.name = name;}public void run(){for(int x=0; x<10; x++){//for(int y=-9999999; y<999999999; y++){}System.out.println(name+"....x="+x+".....name="+Thread.currentThread().getName());}}}class ThreadDemo2 {public static void main(String[] args) {/*建立線程的目的是為了開啟一條執行路徑,去運行指定的代碼和其他代碼實現同時運行。而啟動並執行指定代碼就是這個執行路徑的任務。jvm建立的主線程的任務都定義在了主函數中。而自訂的線程它的任務在哪兒呢?Thread類用於描述線程,線程是需要任務的。所以Thread類也對任務的描述。這個任務就通過Thread類中的run方法來體現。也就是說,run方法就是封裝自訂線程運行任務的函數。run方法中定義就是線程要啟動並執行任務代碼。開啟線程是為了運行指定代碼,所以只有繼承Thread類,並複寫run方法。將啟動並執行代碼定義在run方法中即可。 */////Thread t1 = new Thread();Demo d1 = new Demo("旺財");Demo d2 = new Demo("xiaoqiang");d1.start();//開啟線程,調用run方法。d2.start();System.out.println("over...."+Thread.currentThread().getName());}}//調用run和調用start有什麼區別?package test;/** * 建立線程實現方式二、實現Runnable介面 * 需求:簡單的賣票程式,多視窗同時賣票 * 步驟: * 1、定義類實現 Runnbale介面 * 2、覆蓋run方法。將多線程要啟動並執行方法放到 run方法中 * 3、通過Thread類建立多線程對象。 * 4、將Runnable介面的子物件作為實際參數傳給Thread類 * 5、調用Thread類的start方法開啟線程,(會自己調用run方法) * * Runnable方式的好處: * 1、解決了java不能多繼承的問題 * 2、很好地將票的資源作為共用資源傳入到多個線程。 */public class RunnableTest {public static void main(String[] args) {Ticket t = new Ticket();Thread t1 = new Thread(t);Thread t2 = new Thread(t);Thread t3 = new Thread(t);Thread t4 = new Thread(t);t1.start();t2.start();t3.start();t4.start();}}class Ticket implements Runnable{private int ticket = 100;public void run() {while(true){if(ticket >0 ){System.out.println(Thread.currentThread().getName()+"買出:"+ticket--);}}}}}