我在上一个博客说了两种实现多线程的方法,实现Runnable接口与继承Thread类,表面上看他们都没有什么区别,但在实际使用中继承Thread的较少,实现Runnable的较多。这说明他们之间还是有很大的区别的,下面我们看一下它们的区别:
我们首先给他们设置一个环境,People是一个类它或者实现了Runnable接口或者继承了Thread类,同时他还有一个int属性代表他的血量,初始值是10,在run函数中使当钱血量减一,(每一次调用代表这个被其他人打了)现在的情况是有很多人一起打这个人,让我们看一下两种实现的不同。
Runnable:
package P1;
public class People implements Runnable{
int xue=10;
@Override
public void run() {
xue--;
System.out.println("Oh i have "+xue+" xue new");
}
}
package P1;
public class MagicSquare {
public static void main(String[] args){
People people=new People();
for(int i=1;i<=10;i++){
new Thread(people).start();
}
}
}
Oh i have 9 xue new
Oh i have 7 xue new
Oh i have 8 xue new
Oh i have 6 xue new
Oh i have 4 xue new
Oh i have 4 xue new
Oh i have 6 xue new
Oh i have 3 xue new
Oh i have 2 xue new
Oh i have 1 xue new
我们可以看出一个People实例可以构造多个线程并start(),(也就是可以有多个人打一个人)并且这些线程都共享这个实例的属性,每一次更改都会对这个属性进行影响。
之后是Thread:
package P1;
public class People extends Thread{
int xue=10;
@Override
public void run() {
xue--;
System.out.println("Oh i have "+xue+" xue new");
}
}
package P1;
public class MagicSquare {
public static void main(String[] args){
People people=new People();
for(int i=1;i<=10;i++){
people.start();
}
}
}
Exception in thread "main" Oh i have 9 xue new
java.lang.IllegalThreadStateException
at java.lang.Thread.start(Unknown Source)
at P1.MagicSquare.main(MagicSquare.java:6)
我们看到这时候People继承Thread类并重写run方法,但是我们在执行的时候却报错了,这证明继承了Thread的类无法多次start(),(一个人只能被打一次),他不适应这种情况。
总结一下上面我们发现,实现Runnable接口相比继承Thread类有如下好处:1、接口的特性:避免继承的局限,一个类可以继承多个接口。
2、对情况的适应性高:适合于资源的共享。
但是我们发现虽然可以让多个人打同一个人但是掉血的顺序是错的,为了让他顺序正确我们就要使用“锁”这个东西的,这个东西我们以后再说