/*
* 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();
}
}
本文地址:http://com.8s8s.com/it/it11531.htm