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

本文对比分析了通过继承Thread类和实现Runnable接口两种方式创建多线程时的资源共享问题,并通过示例代码验证了在正确使用synchronized的情况下,两者均可实现资源的有效共享。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值