前言:看到很多博客上都写过多线程的实例以及这两种方式的区别,其中让我报有疑惑的一点是很多都说继承Thread而实现的多线程无法共享资源?我自己下来敲了敲,再结合一些资料做了如下总结
先创建了两个类,一个是继承Extends类的,一个是实现了Runnable接口,其中他们的run方法都给他们加上了synchronized (this)表示同步,以免产生不同线程访问到的资源相同(用继承Thread类测试的时候遇到的,把里面的票数适当增大一点就会看出差异)
MyThreadExtends
package threadTest.wty;
public class MyThreadExtends extends Thread{
//票数
private int ticket = 20;
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (this) {
while(this.ticket>0) {
System.out.println("extends线程开始:"+Thread.currentThread().getName()+"票数"+this.ticket--);
}
}
}
}
MythreadImplements
package threadTest.wty;
public class MythreadImplements implements Runnable{
private int ticket = 50;
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (this) {
while(this.ticket>0) {
System.out.println("implements线程开始:"+Thread.currentThread().getName()+"票数"+this.ticket--);
}
}
}
}
最后写一个测试方法
package threadTest.wty;
public class threadTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//实现Runnable接口实现共享
// MythreadImplements mt1=new MythreadImplements();
// new Thread(mt1,“线程a”).start();
// new Thread(mt1,“线程b”).start();
//继承Thread类
MyThreadExtends myEx1 = new MyThreadExtends();
MyThreadExtends myEx2 = new MyThreadExtends();
new Thread(myEx1,"a线程").start();
new Thread(myEx1,"b线程").start();
}
}
网上有很多博主说Thread不能实现资源共享的代码段是这样的
其实只看代码也大致猜得出最后的结果是什么样的,这里明明就创建了三个不同的线程,每一个线程应该会打印10张票,所以笔者认为不能实现代码共享
但是我们用Runnable接口实现的代码是这样的
最后上面的代码测试个人认为,无论是Runnable还是Thread的方式都可以实现资源共享,只是你实现的方式不同而已,而且线程也很容易出现访问到相同的资源的问题,所以最好在共享资源的代码段加上synchronized 关键字;一般推荐使用Runnable的方式来创建多线程,因为方便扩展,比较一个类如果继承了其他的类便不能继承Thread(Java单继承)