关于操作系统中pv操作的实现

import java.util.Queue;
import java.util.LinkedList;
import java.lang.Thread;
public class Prod
{
static int full=0;//满缓冲区数目,即产品数目
static public int n=10;//缓冲区大小
static int empty=n;//空缓冲区数目
static int mutex=1;//对有界缓冲区进行操作的互斥信号灯
static int produce=0;//剩余产品数
static int producers=0;//总生产数
static int consumers=0;//总消费数,可以为负
static Thread pro=null;
static Thread con=null;
// static Object obj = new Object(); 
public  static void main(String[]args)//主方法pv操作
{
pro=new producer();
pro.start();
// con=new consumer();
 // con.start();
}
 static class  producer extends Thread//生产者线程
{

public void run()
{
while(true)
{
con=new consumer();
  con.start();
try {
Thread.sleep(300);
} catch (InterruptedException e1) {
// TODO 自动生成的 catch 块
e1.printStackTrace();
}
try {
empty=(p(empty,pro));
mutex=(p(mutex,pro));
} catch (InterruptedException e) {
e.printStackTrace();
}
/*if(empty<=0||produce>=n)//空缓冲区不能小于等于零,产品数目不能大于缓冲区大小
{
mutex= (v(mutex,con));
full=(v(full,con));
break;
}
else
{*/

        produce++;
        producers++;
        System.out.println("剩余产品数为"+full);
System.out.println("总生产数为"+ producers);
mutex=(v(mutex,con));
   full=(v(full,con));
//}

}
}
}
static class  consumer extends Thread//消费者线程
{
public void run()
{
while(true)
{
try {
Thread.sleep(100);
} catch (InterruptedException e1) {
// TODO 自动生成的 catch 块
e1.printStackTrace();
}
try {
full=(p(full,con));//抛出异常试图通知其他正在等待对象的监视器而本身没有指定监视器的线程,由于这个问题,程序无法继续
mutex=(p(mutex,con));
} catch (InterruptedException e) {
e.printStackTrace();
}
  //if(produce<=0)//剩余产品数不能小于零
//{
    //v(mutex,pro);
//v(empty,pro);
//break;
//}
//else
//{
       produce--;
       consumers++;
       System.out.println("总消费数为"+consumers);
       mutex=(v(mutex,pro));
empty=(v(empty,pro));
//}   
}
}
}
static Queue<String> queue=new LinkedList<String>();




static int p( int s,Thread object) throws InterruptedException //p操作代码实现
{

s--;
if(s<0)
{
     //object.sleep(10);//阻塞原语
     //object.wait();
    // threadwait();
     synchronized(object){
    try {
    object.wait();
    } catch (InterruptedException e) {
    // TODO 自动生成的 catch 块
    e.printStackTrace();
    }
    }
//queue.addAll((Collection<? extends String>) pro);//插入队列中
}
//int a=s;

//return  p(a,object);
return s;
}
static
int v(int s,Thread object) //v操作代码实现
{
s++;
if(s<=0)
{

object.notify();
//queue.remove();
}
//int a=s;

//return v(a,object);
return s;
}
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值