?? readerlovewriter.java
字號:
import java.io.*;
import java.util.*;
public class ReaderLoveWriter
{
public static void main(String args[])throws Exception
{
VisitData visit=new VisitData();
Scanner scan=new Scanner(new File("threads.txt"));
//文件開頭要寫清多少個線程
int m=scan.nextInt();//第一個讀到的是線程的總數目
int a[][]=new int[m][3];//記錄每個線程的信息。a[m][0]是讀/寫,a[m][1]是等待時間,a[m][2]是讀/寫時間
int h=0;
int writeThread=0,readThread=0;//讀寫數分別多少
int readerNum=0,writerNum=0;
while(scan.hasNext())
{
String str=scan.next();
//System.out.print(str);
if(str.equals("W")) //是寫線程
{
writeThread++;
a[h][0]=0; //0 表示是 寫
a[h][1]=scan.nextInt();//開始時間
a[h][2]=scan.nextInt();//持續時間
h++;
}
else //讀線程
{
readThread++;
a[h][0]=0;
a[h][1]=scan.nextInt();
a[h][2]=scan.nextInt();
h++;
}
}
//System.out.println(h+""+readThread+""+writeThread);
int i=0,n=0;
Writer threadw[]=new Writer[writeThread];//建立線程
Reader threadr[]=new Reader[readThread];
for(int k=0;k<m;k++)
{
if(a[k][0]==0&&i<writeThread)
{
threadw[i]=new Writer(i+1,a[k][1],a[k][2],visit);//線程號,等待時間,讀/寫時間,主要方法。
i++;
}
else
{
threadr[n]=new Reader(n+1,a[k][1],a[k][2],visit);
n++;
}
}
for(int t=0;t<i;t++)
threadw[t].start();//寫進程開始
for(int p=0;p<n;p++)
threadr[p].start();//讀進程開始
}
}
class Reader extends Thread
{
public int waitTime,doingTime,readerNum;//等待時間,讀時間,讀者數
public VisitData visit;
public Reader(int readerNum,int waitTime,int doingTime,VisitData visit )
{
super();
this.waitTime=waitTime;//等待時間
this.doingTime=doingTime;//讀時間
this.readerNum=readerNum;//讀者號
this.visit=visit;
}
public void run()
{
while(true){
try
{
Thread.sleep(waitTime*1000);
}
catch(Exception e){e.printStackTrace();}
System.out.println("-----讀者"+readerNum+"----請求讀^0^\n");
visit.startRead(readerNum);//開始讀
System.out.println("-----讀者"+readerNum+"----正在讀。。。。^0^\n");
visit.doing(doingTime);//讀書中。。
visit.endRead(readerNum); //讀完
}
}
}
class Writer extends Thread
{
public int waitTime,doingTime,writerNum;
public VisitData visit;
public Writer(int writerNum,int waitTime,int doingTime,VisitData visit )
{
super();
this.waitTime=waitTime;//等待時間
this.doingTime=doingTime;//寫時間
this.writerNum=writerNum;//寫者號
this.visit=visit;
}
public void run()
{
while(true){
try
{
Thread.sleep((waitTime+1)*1000);//一直等到這個線程開始的時間
}
catch(Exception e){e.printStackTrace();}
System.out.println("-----寫者"+writerNum+"----請求寫^0^\n");
visit.startWrite(writerNum);//開始寫
System.out.println("-----寫者"+writerNum+"----正在寫。。。。^0^\n");
visit.doing(doingTime);//正在寫
visit.endWrite(writerNum);//結束寫
}
}
}
class VisitData //訪問數據
{
private int readerCount;
private int writerCount;
private boolean beReading;//是否有人在讀
private boolean beWriting;//是否有人在寫
public VisitData() //初始化
{
super();
readerCount=0;
writerCount=0;
beReading=false;
beWriting=false;
}
public void doing(int sleepTime )//用來表示正在讀或寫
{
try{
Thread.sleep((sleepTime+1)*1000);
}catch(Exception e){e.printStackTrace();}
}
public synchronized void startRead(int reader)
{
while(writerCount>0)
{
try{
System.out.println("-----讀者"+reader+"----等待中。。。。^0^\n");
wait();
}catch(Exception e){e.printStackTrace();}
}
readerCount++;
if(readerCount>=1)
{
beReading=true;//表示有人在讀
}
}
public synchronized void endRead(int reader)
{
--readerCount;
if(readerCount==0)
{
beReading=false;//表示沒人在讀
}
notifyAll();
System.out.println("-----讀者"+reader+"----讀結束^0^\n");
}
public synchronized void startWrite(int writer)
{
++writerCount;
while(beReading==true||beWriting==true)//當有讀者或是寫者在讀或是寫的話
{
try
{
System.out.println("-----寫者"+writer+"----等待中。。。。^0^\n");
wait();
}catch(Exception e){System.out.println(e.toString());}
}
beWriting =true;
}
public synchronized void endWrite(int writer)
{
--writerCount;
beWriting=false;
System.out.println("-----寫者"+writer+"----寫結束^0^\n");
notifyAll();//通知其他人
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -