读者写者问题之写者优先(java)

/*
  * 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();
  
  }
  }

你可能感兴趣的:(读者写者问题之写者优先(java))