首页 > 代码库 > java多线程下如何调用一个共同的内存单元(调用同一个对象)

java多线程下如何调用一个共同的内存单元(调用同一个对象)

 1 /* 2  * 关于线程下共享相同的内存单元(包括代码与数据) 3  * ,并利用这些共享单元来实现数据交换,实时通信与必要的同步操作。 4  * 对于Thread(Runnable target)构造方法创建的线程,轮到它来享用CPU资源时。 5  * 目标对象就会自动调用接口中的run()方法 6  * */ 7  8 /* ----------------举例子-------------------  */ 9 10 /* 11  *  使用Thread类创建两个模拟猫和狗的线程,猫和狗共享房屋中的一桶水,即房屋是线程的目标对象12  * ,房屋中的一桶水被猫和狗共享。猫和狗轮流喝水(狗大喝水多,猫小喝水少),当谁被喝尽时,猫和狗进入13  * 死亡状态,猫和狗进入死亡状态。猫和狗在轮流喝水的过程中,主动休息片刻(让THread类调用Sleep(int n))14  * 进入中断状态),而不是等到被强制中断喝水。15  **/16 package DEMO;17 18 public class EXample12_3 {19     20     public static void main( String args [] )21     {22         House house = new House();23         house.setWater(10);24         Thread dog,cat ;25         dog = new Thread(house);  //dog和cat的目标对象相同26         cat = new Thread(house);27         dog.setName("");28         dog.setName("");29         dog.start();30         cat.start();31     }   32 }33 34 class House implements Runnable35 {36     int WaterAmount ;       37     38     public void setWater(int w)39     {40        WaterAmount = w;       41     }42     public void run() {43       // TODO Auto-generated method stub44        while(true)45       {46           String name =Thread.currentThread().getName();47          if(name.equals(""))48          {49               System.out.println(name+"喝水");50              WaterAmount =WaterAmount-2;51          }52       else53           if(name.equals(""))54          {55             System.out.println(name+"喝水");56             WaterAmount=WaterAmount-1;57          }58      59       System.out.println(""+WaterAmount);60       try {61         Thread.sleep(2000);       //间隔时间62     } catch (InterruptedException e) {63         // TODO Auto-generated catch block64         e.printStackTrace();65     }66       if(WaterAmount<=0)  return ;67     }68 }69 }

/*需要注意的是: 一个线程的run方法的执行过程中可能随时被强制中断(特别是对于双核系统的计算机)*/