欢迎来到天天文库
浏览记录
ID:5618445
大小:47.50 KB
页数:4页
时间:2017-12-20
《操作系统读者写者问题》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、读者写者问题importjava.lang.Math;classBuffer{privateintbuffer;//定义一个缓冲区bufferprivateintreadCount=0;//定义readCount为目前的读者数目booleanisRead=false;//定义互斥变量isRead,因为刚开始时写者还没有把数据写入,所以为falsebooleanisWrite=true;//定义的互斥变量,因为刚开始时需要学入数据,所以初始状态为truepublicsynchronizedvoidwrite(intn
2、){//定义互斥的访问方法,某一时间只能有一个成员访问此方法,这由synchronized决定,相当于wait(s)和signal(s)合起来while(isRead)//判断当前是否为“读”状态,如果是,则自己调用Object自带的方法wait()阻塞自己try{this.wait();}catch(InterruptedExceptione){//意外处理机制,可以忽略不管}buffer=n;//当开关打开之后,给缓冲区写入数据isWrite=false;//写入完成后,将“写”状态,设置为假,代表此时可以读S
3、ystem.out.println(Thread.currentThread().getName()+"书写了"+buffer);//为了了解程序运行输出写入的数据notify();//唤醒当前所有处于阻塞状态的线程}publicsynchronizedvoidenterRead(){//定义读者读之前的动作,此方法一样得是互斥访问的while(readCount==0&&isWrite)//如果这是第一个读者并且写者正在给缓冲区写入数据,则自己调用wait()阻塞自己try{this.wait();}catch(
4、InterruptedExceptionE){}isRead=true;//锁打开之后,将读设置为真,此时不能进行写操作readCount++;//读者数加一}publicsynchronizedvoidexitRead(){//描述读者退出时的动作readCount--;//读者数目减一if(readCount==0){//最后一个读者退出的时候,将“读”状态置为假isRead=false;}notifyAll();//唤醒所有处于阻塞状态的线程}publicvoidread(){//读者所有的动作,进>>读数>
5、>退出enterRead();System.out.println(""+Thread.currentThread().getName()+"读到数据为"+buffer);exitRead();}}classWriterextendsThread{//定义一个,写者的类,此类为线程继承ThreadprivateBufferbuffer;//写者的成员,为Buffer类publicWriter(Bufferbuffer){this.buffer=buffer;}publicvoidrun(){//写着所具有的动作或者
6、说是行为,随机的写入数据intn=(int)(Math.random()*100);buffer.write(n);}}classReaderextendsThread{//定义一个读者的类privateBufferbuffer;publicReader(Bufferbuffer){this.buffer=buffer;}publicvoidrun(){//读的动作buffer.read();}}publicclassWriterAndReader{//主类publicstaticvoidmain(String[]
7、args){//主方法Bufferbuffer=newBuffer();//一个Buffer类newWriter(buffer).start();//定义了四个写者和四个读者newReader(buffer).start();newWriter(buffer).start();newReader(buffer).start();newWriter(buffer).start();newReader(buffer).start();newWriter(buffer).start();newReader(buffer)
8、.start();}}
此文档下载收益归作者所有