我们都知道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接口的区别