歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java 多線性讀者寫者問題

Java 多線性讀者寫者問題

  1. package namespace;  
  2. class Man   
  3. {  
  4.     String name;  
  5.     String sex;  
  6.     boolean flag=false;//  定義一個開關變量,用來進行讀或寫的操作   
  7. }  
  8. class Input implements Runnable  
  9. {  
  10.     private Man man;  
  11.     private static  int num=1;//用於控制兩次寫進去的值不一樣    
  12.       
  13.     public Input(Man m)  
  14.     {  
  15.         this.man=m;  
  16.     }  
  17.     public void run()  
  18.     {  
  19.         while(true)  
  20.             {  
  21.                synchronized(man) {  
  22.                    if(man.flag)//如果flag=true的話,就代表已經寫進去值了,所以就要等待   
  23.                        try { man.wait();}catch(Exception e) {}  
  24.                          
  25.                    if(num==1)//等待被喚醒之後,下面就要對其進行寫的操作了   
  26.                    {  
  27.                         man.name="mike";  
  28.                         man.sex="男";  
  29.                               
  30.                    }else {  
  31.                         man.name="Lily";  
  32.                         man.sex="女";  
  33.                         }  
  34.                    //上面是已經執行完寫的動作   
  35.                   
  36.                    man.flag=true;//寫完之後,要把flag設置成true ,這代表已經寫完,等被讀,如果再執行寫操作的話,上面flag=true ,就開始了等待了   
  37.                    num=(num+1)%2;  
  38.                    man.notify();//   
  39.                       
  40.                }  
  41.                               
  42.             }  
  43.     }  
  44. }  
  45. class Output implements Runnable  
  46. {  
  47.     private Man man;  
  48.     public Output(Man m)  
  49.     {  
  50.         this.man=m;  
  51.     }  
  52.     public void run()  
  53.     {  
  54.         while(true)  
  55.         {  
  56.             synchronized(man)  
  57.             {  
  58.                 if(!man.flag)  
  59.                        try { man.wait();}catch(Exception e) {}  
  60.                        
  61.                 System.out.println(man.name+"...."+man.sex);  
  62.                 man.flag=false;  
  63.                 man.notify();  
  64.                   
  65.               
  66.             }  
  67.         }  
  68.     }  
  69. }  
  70. public class Study  
  71. {  
  72.     public static void main(String args[])  
  73.     {  
  74.         Man man=new Man();  
  75.         Thread t1=new Thread(new Input(man));  
  76.         Thread t2=new Thread(new Output(man));  
  77.         t1.start();  
  78.         t2.start();  
  79.     }  
  80. }  
  81. /* 
  82.  *              多線程讀者寫者問題 
  83.  *                  線程之間的通信一般都是一段共享數據的操作來進行通信的 
  84.  * 
  85.  *          裡面的兩個線程就是一個讀一個寫,然而這兩個操作是通過兩個線程同時進行的.因此如果線程不同步,將會出現安全性問題 
  86.  *          所謂的安全性問題就是線和寫和線和讀的結果不一樣,出就是讀出來的值並不是寫進行的那樣,這樣就出來了安全性問題 
  87.  *問題的解決: 
  88.  *      出現這種同時操作一個對象的問題,就是把它們操作那個對象的代碼進行同步 
  89.  *      讀者與寫者的問題要考慮到兩個方面: 
  90.  *              1. 讀和寫的兩個線程要同步 
  91.  *              2. 讀和寫要寫進去一個就讀一個 
  92.  * 
  93.  *  
  94.  *  
  95.  * */  
  96.  /*                                             2011/10/23  21:22:20 
  97.   * */  
Copyright © Linux教程網 All Rights Reserved