实现Runnable接口的多线程可以实现属性共享的原因

为什么实现Runnable接口来创建的线程可以实现数据共享?

先来看看我们是实现Runnable接口时是如何启动线程的:

class R implements Runnable{}               //人比较懒,省略一些对本问题无用的东西

class Demo{

R r = new R();

new Thread(r).start();

}

 

重点就是红色这里了。

画个图帮助一下理解:



我们利用单个Runnable实例r来创建了两个线程,那么这两个线程操作的其实都是实例r里面的属性和方法,所以能实现资源共享。

有人给我说过一个比较生动的比如:

Runnable实例r就像一个苹果,利用它创建的线程就像小虫子,咬的都是这个苹果。

 

那么,从上面可以看出来属性共享的范围

只有用同一个Runnable实例创建的线程才有属性共享这个特性。

 

很简单的理解,不同Runnable的实例就如不同的苹果。不是A苹果出来的虫子咬不到A苹果。

例子:

class A implements Runnable{
	private int x = 10;
	public synchronized void run(){			//覆盖Thread类中的run方法。里面要写的是该线程的执行任务
		for(int i = 0; i <20; i++){
			System.out.println("线程"+Thread.currentThread().getName()+"正在运行"+(x++));
			
		}
	}
}
class ThreadDemo{
	public static void main(String args[]){
		A a = new A();
		A b = new A();
		new Thread(a,"a1").start();
		new Thread(a,"a2").start();
		new Thread(b,"b").start();

	}
}

部分结果:


可以看到b只是在修改实例b中的Ii,而a2,a1的i值是它们两个一起修改的,是Runnable实例a中的i.

 

希望能给大家一点小帮助。同时这也是我对自己思路的一个整理~



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值