java線程的實現方式

java有兩種實現線程的方式,一種是經過繼承Thread類,一種是經過實現Runnable接口。java

經過Thread實現代碼架構

public class A extends Thread{
    
    @Override
    public void run(){
        System.out.println("hello world");
    }
}

經過Runnable實現代碼ide

public class B implements Runnable{
    
    @Override
    public void run(){
        System.out.println("hello world");
    }
}

相對於Thread類實現,Runnable接口實現有更好的擴張性,更加推薦使用。在java中每一個類都只能有一個父類,可是卻能夠有不少個接口。對於一個類來講,若是選擇以繼承Thread方式實現線程的話,該類就不能繼承其餘類的,這樣就使得這個類失去了經過繼承獲取其餘類功能的能力,除非他繼承的父類已經繼承了Thread類(可是,可能增長了項目的複雜度,造成多級繼承的架構)。若是選擇Runnable接口的話,就沒有那麼多煩惱了,只是令某個類增長了線程的功能而已,對這個類的其餘功能,以及類之間的關係都不會形成影響。稍微形象些,用遊戲比較的話,選擇繼承Thread至關於選擇了種族,選擇Runnable接口則至關於拿了一件裝備,因此明顯是繼承的影響比較大,使用Runnable接口比較靠譜。線程

上網查資料時,在部分文章裏面提出Runnable能夠實現「資源共享」,而Thread則不行。可是實際操做後,發現這是錯誤的。Thread類型也是繼承了Runnable方法,因此也能夠實現資源共享。code

驗證代碼以下:對象

Runnable接口實現繼承

public class ThreadTester {
    public static void main(String[] args){
        ThreadA a1 = new ThreadA();
        new Thread(a1,"接口實現——甲").start();
        new Thread(a1,"接口實現——乙").start();
        new Thread(a1,"接口實現——丙").start();
    }
}

class ThreadA implements Runnable{
    int i=0;
    @Override
    public void run(){
        for(;i<10;) {
            System.out.println(Thread.currentThread().getName()+" Thread is running , i is "+i++);
        }
    }
}

運行結果爲:接口

接口實現——甲 Thread is running , i is 0
接口實現——丙 Thread is running , i is 2
接口實現——乙 Thread is running , i is 1
接口實現——乙 Thread is running , i is 5
接口實現——乙 Thread is running , i is 6
接口實現——乙 Thread is running , i is 7
接口實現——乙 Thread is running , i is 8
接口實現——乙 Thread is running , i is 9
接口實現——丙 Thread is running , i is 4
接口實現——甲 Thread is running , i is 3

Thread繼承實現遊戲

public class ThreadTester {
    public static void main(String[] args){
        
        ThreadB b1 = new ThreadB();
        new Thread(b1,"類繼承實現——甲").start();
        new Thread(b1,"類繼承實現——乙").start();
        new Thread(b1,"類繼承實現——丙").start();
    }
}

class ThreadB extends Thread{
    int i=0;
    @Override
    public void run(){
        for(;i<10;) {
            System.out.println(Thread.currentThread().getName()+" Thread is running , i is "+i++);
        }
    }
}

運行結果爲:內存

類繼承實現——甲 Thread is running , i is 0
類繼承實現——甲 Thread is running , i is 2
類繼承實現——甲 Thread is running , i is 3
類繼承實現——甲 Thread is running , i is 4
類繼承實現——乙 Thread is running , i is 1
類繼承實現——乙 Thread is running , i is 7
類繼承實現——乙 Thread is running , i is 8
類繼承實現——甲 Thread is running , i is 6
類繼承實現——丙 Thread is running , i is 5
類繼承實現——乙 Thread is running , i is 9

================================

Runnable 實現資源共享的原理其實也比較簡單,在以上的代碼中,系統聲明瞭一個Thread對象,並將這個對象做爲一個參數傳遞給三個線程,而後啓動。在這個過程當中三個線程實際引用了一開始聲明的Thread對象,使用的是這個對象的內存空間,因此任意一方的修改,就會致使其餘線程也發生更改。

因此能不能資源共享,就是看是否是聲明的對個對象,開闢了不一樣的內存空間

相關文章
相關標籤/搜索