線程的建立有兩種方式,分別是繼承Thread類和實現Runnable接口,那麼這兩種方式有什麼相同點,以及區別在何處呢?java
首先經過兩個實例還看一下他們的相同之處:編程
實例1:使用繼承Thread類多線程
建立子類MultiExtendThread: ide
public class MultiExtendThread extends Thread { private int ticket = 10;//每一個線程擁有10張票 private String name; MultiThread3(String name) { this.name = name; } public void run() { while (ticket > 0) { System.out.println(ticket-- + " is saled by " + name); } } }
測試類: 測試
public static void main(String[] args) { MultiExtendThread m1 = new MultiExtendThread ("Window 1"); MultiExtendThread m2 = new MultiExtendThread ("Window 2"); MultiExtendThread m3 = new MultiExtendThread ("Window 3"); //建立3個線程 Thread t1 = new Thread(m1 ); Thread t2 = new Thread(m2); Thread t3 = new Thread(m3); t1.start(); t2.start(); t3.start(); }
測試結果:以多線程的形式各自打印出售票信息,每一個線程分別打印10條記錄,以下:this
實例2:使用實現Runnable接口方式spa
實現Runnable接口的類: 線程
public class MultiThread1 implements Runnable { private int ticket = 10;//每一個線程都擁有10張票 private String name; MultiThread1(String name) { this.name = name; } public void run() { while (ticket > 0) { System.out.println(ticket-- + " is saled by " + name); } }
測試類: code
public static void main(String[] args) { MultiThread1 m1 = new MultiThread1("Window 1"); MultiThread1 m2 = new MultiThread1("Window 2"); MultiThread1 m3 = new MultiThread1("Window 3"); //建立3個線程 Thread t1 = new Thread(m1 ); Thread t2 = new Thread(m2); Thread t3 = new Thread(m3); t1.start(); t2.start(); t3.start(); }
測試結果同實例1對象
經過以上兩個實例,來看一下二者的相同之處:
均可以保證新建線程彼此相互獨立,各自擁有資源,互補干擾。在這樣的場景先,不管使用哪一種形式均可以。
不一樣之處:
java的一個特性是僅支持單繼承,這樣若是是經過繼承Thread來實現多線程時,該類將沒法再擴展其餘的類,不能實現負責的功能。而使用實現Runnable接口時,一樣還能夠實現其餘的接口,這樣就避免單繼承所帶來的侷限。還有一點是,實現Runnable接口建立的線程還能夠處理同一資源,實現資源的共享。
實例3:多個售票窗口能夠共同售10張票
public class MultiThread2 implements Runnable { private int ticket = 10; @Override public void run() { while (ticket > 0) { System.out.println(ticket-- + " is saled by " + Thread.currentThread().getName()); } } }
測試類:
public static void main(String[] args) { //建立一個實例 MultiThread2 m = new MultiThread2(); //建立三個線程,三個線程共同擁有同一個實例 Thread t1 = new Thread(m, "Window 1"); Thread t2 = new Thread(m, "Window 2"); Thread t3 = new Thread(m, "Window 3"); t1.start(); t2.start(); t3.start(); }
實例結果:
總結:
採用繼承Thread類方式: (1)優勢:編寫簡單,若是須要訪問當前線程,無需使用Thread.currentThread()方法,直接使用this,便可得到當前線程。 (2)缺點:由於線程類已經繼承了Thread類,因此不能再繼承其餘的父類。 採用實現Runnable接口方式: (1)優勢:線程類只是實現了Runable接口,還能夠繼承其餘的類。在這種方式下,能夠多個線程共享同一個目標對象,因此很是適合多個相同線程來處理同一份資源的狀況。 (2)缺點:編程稍微複雜,若是須要訪問當前線程,必須使用Thread.currentThread()方法。