我們都知道Thread是繼承,Runnable是接口
用的時候繼承Thread或者實現Runnable接口,繼承只能單繼承,接口可以實現多個
第一種繼承Thread
public class MThread extends Thread{
public int sum=30;
@Override
public void run() {
int i;
for (i = 0; i < 10; i++) {
sum--;
}
System.out.println(sum);
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
MThread m1=new MThread();
m1.start();
m1.run();
}
}
打印結果:
20
main
10
Thread-0
這個結果就說明啦run方法和start方法的區別
那就是 執行時所在的線程不同,這個大家切記
public class MRunnable implements Runnable{
public int sum=30;
@Override
public void run() {
// TODO Auto-generated method stub
int i;
for (i = 0; i < 10; i++) {
sum--;
}
System.out.println(sum);
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
Thread m1=new Thread(new MRunnable());
m1.start();
m1.run();
}
}
20
main
10
Thread-0
結果跟上一個一致
但是兩個之間還是有很大的差距
把一個main方法改成:
public static void main(String[] args) {
MThread m1=new MThread();
m1.start();
MThread m2=new MThread();
MThread m3=new MThread();
m2.start();
m3.start();
}
輸出結果:
20
Thread-2
20
Thread-0
20
Thread-1
也把第二個方法改:
</pre><pre code_snippet_id="1826232" snippet_file_name="blog_20160812_8_2808312" name="code" class="java">public static void main(String[] args) {
MRunnable mr= new MRunnable();
Thread m1=new Thread(mr);
m1.start();
Thread m2=new Thread(mr);
Thread m3=new Thread(mr);
m2.start();
m3.start();
}
結果爲:
20
Thread-2
10
Thread-1
0
Thread-0
那麼實現runnable接口是可以實現多線程數據共享的,
而繼承Thread,多線程間數據是獨立的
所以我們必須認識到start方法和run方法的區別
必須認識到 Thread和實現runnable接口的區別