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;
}
}
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;
}
}