1. 程式人生 > >細說繼承Thread類和實現Runnable介面來建立執行緒的區別

細說繼承Thread類和實現Runnable介面來建立執行緒的區別

建立執行緒有兩種方法,一種是繼承Tread類,另一種是繼承Runnable介面

繼承Tread類

MyThread extends Thread{
    @overwrite
    public void run(){
    業務流程
    }
}
public static void main(String[] args){
    MyThread mt = new MyTread();
    mt.start();
}

實現Runnable介面

MyThread implements Runnable{
    @overwrite
    public void
run(){ 業務流程 } } public static void main(String[] args){ MyThread mt = new MyTread(); Thread td = new Thread(mt); td.start(); }

從程式碼的角度來說,實現Runnable介面比繼承Thread,多了一個步驟,把要乾的事塞進了一執行緒裡(可以這麼理解)
但是java是一種單繼承語言,用Runnable介面就擺脫了這種缺陷,並且,對於同一個資源的消耗來說,要用Runnable介面,繼承Thread類無法處理對相同資源處理的情況,即Runnable的程式碼,可以被多個執行緒(Thread例項)共享
例如多個售票視窗售票:

現有3個視窗,賣5張票

繼承Thread類實現

class MyThread extends Thread{
    private int ticket = 5;  //總票數
    private String name;  //視窗號 
    public MyThread(String name) {
        this.name=name;
    }
    @Override
    public void run() {
        while(ticket>0){
            ticket--;
            System.out.println(name+"買了1張票,剩餘票數為:"
+ticket); } } } public class TicketThread { public static void main(String[] args) { //建立三個執行緒來模擬三個售票視窗 MyThread mt1 = new MyThread("視窗1"); MyThread mt2 = new MyThread("視窗2"); MyThread mt3 = new MyThread("視窗3"); mt1.start(); mt2.start(); mt3.start(); } }

結果為:這裡寫圖片描述
可以看出繼承Thread類無法處理這種情況

實現Runnable介面

class MyThreadr implements Runnable{

    private int ticket = 5;  //總票數
    @Override
    public void run() {
        while(ticket>0){
            ticket--;
            //Thread.currentThread()代表當前執行緒
            System.out.println(Thread.currentThread().getName()+"買了1張票,剩餘票數為:"+ticket);
        }
    }
}
public class TicketRunnableThread {
    public static void main(String[] args) {
        MyThreadr mt1 = new MyThreadr();
        //建立三個執行緒來模擬三個售票視窗
        //Thread有種預設的構造方法,可以這樣建立執行緒時給執行緒起名
        Thread td1 = new Thread(mt1,"視窗1");
        Thread td2 = new Thread(mt1,"視窗2");
        Thread td3 = new Thread(mt1,"視窗3");
        td1.start();
        td2.start();
        td3.start();
    }
}

結果為:
這裡寫圖片描述

另外如果把建立執行緒的方式換成這樣的話,那麼就跟繼承Thread類一樣了

    public static void main(String[] args) {
        MyThreadr mt1 = new MyThreadr();
        MyThreadr mt2 = new MyThreadr();
        MyThreadr mt3 = new MyThreadr();
        //建立三個執行緒來模擬三個售票視窗
        //Thread有種預設的構造方法,可以這樣建立執行緒時給執行緒起名
        Thread td1 = new Thread(mt1,"視窗1");
        Thread td2 = new Thread(mt2,"視窗2");
        Thread td3 = new Thread(mt3,"視窗3");
        td1.start();
        td2.start();
        td3.start();
    }