也不算自己写的吧,我是看过《现代操作系统》然后将其中的代码进行完善。
public class ProcessAndConsumer {
/**
* @param args
*/
static final int N =100;
static Producer p= new Producer();
static Consumer c= new Consumer();
static Our_monitor mon = new Our_monitor();
public static void main(String[] args) {
// TODO Auto-generated method stub
p.start();
c.start();
}
//生产者生产商品线程
static class Producer extends Thread{
public void run(){
int item;
while(true){
item=producer_item();
mon.insert(item);
}
}
private int producer_item(){
int item;
item=(int)(Math.random()*100+1);
System.out.println("生产者生产了产品:"+item);
return item;
}
}
//消费者消费线程
static class Consumer extends Thread{
public void run(){
int item;
while(true){
item=mon.remove();
consumer_item(item);
}
}
private void consumer_item(int item){
int i=0;
//判断缓冲区中是否有这个商品(因为商品都用编号区分)然后置为0,表示没有商品
for(i=0;i<N;i++)
if(item == mon.buffer[i]){
mon.buffer[i]=0;
System.out.println("消费者消费了产品"+item); //这里标明如果是说消费产品是0的话表示原来那个buffer位置是没有产品的
break;
}
}
}
//管程实现线程
static class Our_monitor{
private int buffer[] =new int[N];
private int count =0,lo=0,hi=0;
public synchronized void insert(int val){
if(count == N)
go_to_sleep();
buffer[hi]=val;
hi=(hi+1)%N;
count=count+1;
if(count == 1)
notify();
}
public synchronized int remove(){
int val;
if(count ==0 )
go_to_sleep();
val=buffer[lo];
lo=(lo+1)%N;
count=count-1;
if(count == N-1)
notify();
return val;
}
private void go_to_sleep(){
try {
wait();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
}
转载于:https://blog.51cto.com/hxm1236/1300854