也不算自己寫的吧,我是看過《現代操作系統》然後將其中的代碼進行完善。
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(); } } } }