啥都先不說,運行兩段程序看看結果再分析
實現Runnable接口的程序代碼
public class ThreadTest1 implements Runnable { private int num = 10; @Override public void run() { for (int i = 0; i <= 100; i++) { if (num > 0) { System.out.println(Thread.currentThread().getName()+"執行結果:" + (num--)); } } } public static void main(String[] args) { ThreadTest1 t1 = new ThreadTest1(); Thread t01 = new Thread(t1, "線程1"); Thread t02 = new Thread(t1, "線程2"); Thread t03 = new Thread(t1, "線程3"); t01.start(); t02.start(); t03.start(); } }
運行結果:
線程2執行結果:9 線程3執行結果:8 線程3執行結果:6 線程1執行結果:10 線程3執行結果:5 線程2執行結果:7 線程3執行結果:3 線程3執行結果:1 線程1執行結果:4 線程2執行結果:2
繼承Thread類的實現代碼
public class ThreadTest2 extends Thread{ private int num = 10; @Override public void run() { for(int i =0; i <=100; i++) { if(num >0) { System.out.println(Thread.currentThread().getName()+"執行結果:"+(num--)); } } } public static void main(String[] args) { ThreadTest2 t01 = new ThreadTest2(); ThreadTest2 t02 = new ThreadTest2(); ThreadTest2 t03 = new ThreadTest2(); t01.start(); t02.start(); t03.start(); } }
運行結果:
Thread-0執行結果:10 Thread-0執行結果:9 Thread-0執行結果:8 Thread-0執行結果:7 Thread-0執行結果:6 Thread-0執行結果:5 Thread-0執行結果:4 Thread-0執行結果:3 Thread-0執行結果:2 Thread-0執行結果:1 Thread-1執行結果:10 Thread-1執行結果:9 Thread-1執行結果:8 Thread-1執行結果:7 Thread-1執行結果:6 Thread-1執行結果:5 Thread-1執行結果:4 Thread-1執行結果:3 Thread-2執行結果:10 Thread-2執行結果:9 Thread-2執行結果:8 Thread-1執行結果:2 Thread-2執行結果:7 Thread-1執行結果:1 Thread-2執行結果:6 Thread-2執行結果:5 Thread-2執行結果:4 Thread-2執行結果:3 Thread-2執行結果:2 Thread-2執行結果:1
從上面的運行結果可以看出,兩者的區別。
實現Runnable接口的,對於三個線程來說共享的是ThreadTest1對象的資源。
繼承Thread類,三個線程都是獨立的運行,線程間不共享資源。
所以可以總結出以下區別:
1.Runnable接口的話,可以避免單繼承的局限性,具有較強的健壯性。
2.Runnable可以實現資源的共享,同時處理同一資源。
3.Thread類的線程間都是獨立運行的,資源不共享。
4.繼承Thread類不再被其他類繼承(java不存在多繼承)