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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zuolovefu/article/details/40264719

为什么实现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.

 

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



阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页