实现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苹果。

例子:

[java] view plain copy
 
  1. class A implements Runnable{  
  2.     private int x = 10;  
  3.     public synchronized void run(){         //覆盖Thread类中的run方法。里面要写的是该线程的执行任务  
  4.         for(int i = 0; i <20; i++){  
  5.             System.out.println("线程"+Thread.currentThread().getName()+"正在运行"+(x++));  
  6.               
  7.         }  
  8.     }  
  9. }  
  10. class ThreadDemo{  
  11.     public static void main(String args[]){  
  12.         A a = new A();  
  13.         A b = new A();  
  14.         new Thread(a,"a1").start();  
  15.         new Thread(a,"a2").start();  
  16.         new Thread(b,"b").start();  
  17.   
  18.     }  
  19. }  

 

 

 

部分结果:

 

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

 

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

posted @ 2016-12-08 09:22  天涯海角路  阅读(507)  评论(0)    收藏  举报