多线程之实现Runnable与继承Thread的区别

我在上一个博客说了两种实现多线程的方法,实现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、对情况的适应性高:适合于资源的共享。


但是我们发现虽然可以让多个人打同一个人但是掉血的顺序是错的,为了让他顺序正确我们就要使用“锁”这个东西的,这个东西我们以后再说
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值