JAVA多线程—创建线程的两种方式Runnable和Thread的区别

前言:看到很多博客上都写过多线程的实例以及这两种方式的区别,其中让我报有疑惑的一点是很多都说继承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单继承)

发布了93 篇原创文章 · 获赞 26 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_38261445/article/details/96870798