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對象,使用的是這個對象的內存空間,因此任意一方的修改,就會致使其餘線程也發生更改。
因此能不能資源共享,就是看是否是聲明的對個對象,開闢了不一樣的內存空間