为什么实现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.
希望能给大家一点小帮助。同时这也是我对自己思路的一个整理~