/*  * Created on 2005-1-9  *  * TODO To change the template for this generated file go to  * Window - Preferences - Java - Code Style - Code Templates  */ 
/**  * @author Michelangelo  *  * TODO To change the template for this generated type comment go to  * Window - Preferences - Java - Code Style - Code Templates  */ public class Database { 
 /**   *    */  private static final int  NAP_TIME=5;  private int readerCount;  private int writerCount;  private boolean dbReading;  private boolean dbWriting;  public Database() {   super();   readerCount=0;   writerCount=0;   dbReading=false;   dbWriting=false;   // TODO Auto-generated constructor stub  }       public static void napping(){   int sleepTime=(int)(NAP_TIME * Math.random());   try{    Thread.sleep(sleepTime*1000);   }   catch(Exception e){    e.printStackTrace();   }  }  public synchronized int startRead(){   while(writerCount>0){    try{     System.out.println("reader is waiting");     wait();    }    catch(Exception e){     System.out.println(e.toString());     e.printStackTrace();    }   }   ++readerCount;   if(readerCount==1){   dbReading=true;   }   return readerCount;     }  public synchronized int endReading(){   --readerCount;   if(readerCount==0){    dbReading=false;   }   notifyAll();   System.out.println("one reader is done reading. Count="+readerCount);   return readerCount;  }    public synchronized void startWriting(){   ++writerCount;   while(dbReading==true||dbWriting==true){    try{     System.out.println("Writer is waiting");     wait();    }    catch(Exception e){     System.out.println(e.toString());    }       }   dbWriting =true;  }  public synchronized void endWriting(){   --writerCount;   dbWriting=false;   System.out.println("one writer is done writing. Count="+writerCount);      notifyAll();  }       } 
/*  * Created on 2005-1-9  *  * TODO To change the template for this generated file go to  * Window - Preferences - Java - Code Style - Code Templates  */ 
/**  * @author Michelangelo  *  * TODO To change the template for this generated type comment go to  * Window - Preferences - Java - Code Style - Code Templates  */ public class Reader extends Thread{ 
 /**   *    */  private Database server;  private int readerNum;  public Reader(int r,Database db) {   super();   readerNum=r;   server=db;      // TODO Auto-generated constructor stub  }  public void run(){   int c;   while(true){    System.out.println("reader "+readerNum+" is sleeping");    Database.napping();    System.out.println("reader "+readerNum+" wants to read");    c=server.startRead();        System.out.println("reader "+readerNum+" is reading. Count="+c);    Database.napping();    c=server.endReading();    System.out.println("It is reader "+readerNum+" who has done reading according to count="+c);       }  } 
 }
  
/*  * Created on 2005-1-9  *  * TODO To change the template for this generated file go to  * Window - Preferences - Java - Code Style - Code Templates  */ 
/**  * @author Michelangelo  *  * TODO To change the template for this generated type comment go to  * Window - Preferences - Java - Code Style - Code Templates  */ public class Writer extends Thread{     private Database server;     private int writerNum;  /**   *    */  public Writer(int w,Database db) {   super();   writerNum=w;   server=db;   // TODO Auto-generated constructor stub  }  public void run(){   while(true){    System.out.println("Writer "+writerNum+" is sleeping");    Database.napping();    System.out.println("Writer "+writerNum+" wants to write");    server.startWriting();        System.out.println("Writer "+writerNum+" is writing");    Database.napping();    server.endWriting();        System.out.println("It is Writer "+writerNum+" who has done writing .");       }     } 
 }
  
/*  * Created on 2005-1-9  *  * TODO To change the template for this generated file go to  * Window - Preferences - Java - Code Style - Code Templates  */ 
/**  * @author Michelangelo  *  * TODO To change the template for this generated type comment go to  * Window - Preferences - Java - Code Style - Code Templates  */ public class DatabaseServer { 
 /**   *    */  public DatabaseServer() {   super();   // TODO Auto-generated constructor stub  } 
 public static void main(String[] args) {   Database db=new Database();   Reader r1=new Reader(1,db);   Reader r2=new Reader(2,db);   Reader r3=new Reader(3,db);   Reader r4=new Reader(4,db);   Writer w1=new Writer(1,db);   Writer w2=new Writer(2,db);      r1.start();   r2.start();   r3.start();   w1.start();   r4.start();   w2.start();     } }
   
 
  |