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 Runnable
35 {
36     int WaterAmount ;       
37     
38     public void setWater(int w)
39     {
40        WaterAmount = w;       
41     }
42     public void run() {
43       // TODO Auto-generated method stub
44        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       else
53           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 block
64         e.printStackTrace();
65     }
66       if(WaterAmount<=0)  return ;
67     }
68 }
69 }

/*
需要注意的是: 一個線程的run方法的執行過程中可能隨時被強制中斷(特別是對於雙核系統的計算機)
*/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM