Thread和Runnable多线程共享资源问题

作为小白,我一直认为继承Thread不能实现多线程共享资源,只有实现Runnable接口才可以。但是我最近看到文章中有如下代码
public
class Thread implements Runnable {
    /* Make sure registerNatives is the first thing <clinit> does. */
    private static native void registerNatives();
    static {
        registerNatives();
    }

    private volatile String name;
    private int            priority;
    private Thread         threadQ;
    private long           eetop;
  • thread 也实现了Runnable接口,那么thread也应该可以实现资源共享。我就进行了如下测试
实现Runnable接口
public class Task1 implements Runnable  {

	
	private int i = 10;
	
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(i>0) {
			System.out.println(Thread.currentThread().getName()+(i--));
		}
		
	}	
	
}
  • 测试类
public static void runnableTest() {
		
		Task1 task1 = new Task1();
		Thread thread1 = new Thread(task1,"一号");
		Thread thread2 = new Thread(task1,"二号");
		thread1.start();
		thread2.start();
	}

```![在这里插入图片描述](https://img-blog.csdnimg.cn/20200724135251594.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNjcyNDAx,size_16,color_FFFFFF,t_70)

继承Thread实现资源共享
public class Task2 extends Thread {

	private int i = 10;
	
	@Override
	public void run() {
		while(i > 0) {
			System.out.println(Thread.currentThread().getName()+(i--));
		}
	}
	
}
  • 测试类
public static void main(String[] args) {
		
		ThreadTest();
		
	}
	
	
	public static void ThreadTest() {
		Task2 task2 = new Task2();
		Thread thread = new Thread(task2,"一号");
		Thread thread1 = new Thread(task2,"二号");
		thread.start();
		thread1.start();
		
	}
  • 这里因为创建Thread对象可以传入Runnable的子类,那么Thread实现Runnable同样可以作为参数传入到Thread构造器中
    在这里插入图片描述
总结:Thread和runnnable同样可以实现资源共享,但是为什么还是要推荐使用runnable,因为Java是单继承、多实现。如果我继承了Thread,那么该类就不能继承其他类了,如果我实现接口,我还可以实现其他接口。我之前看教材都是说Thread不能多线程处理同一资源,其实是他们new了三个Thread对象,所以无法共享资源。
public static void ThreadTest() {
		//共享资源代码
		Task2 task2 = new Task2();
		Thread thread = new Thread(task2,"一号");
		Thread thread1 = new Thread(task2,"二号");
		thread.start();
		thread1.start();
		//不可共享资源
		Task2 task3 = new Task2();
		Task2 task4 = new Task2();
		task3.start();
		task4.start();
	}
	```
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值