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

|