public class Clerk { /** * 生產者 */ private int pro=0; public synchronized void add(){ if(this.pro>=10){ try { wait();//生產滿了 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ pro++; System.out.println("生產者今天生產了"+pro+"個產品"); notifyAll();//生產了商品,喚醒消費者購買線程。 } } /** * 消費者 */ public synchronized void get(){ if(pro<=0){ try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }//產品沒有貨了 }else{ pro--; System.out.println("消費者今天取了"+pro+"個產品"); notifyAll(); // 喚醒其餘線程,當有出售商品時則喚醒生產者進行生產商品 } } } public class consumer implements Runnable{ /** * 生產者開始取走東西 */ private Clerk c; public consumer(Clerk c){ this.c=c; } public void run() { System.out.println("消費者開始取走商品"); while(true){//判斷是否是爲真 try { Thread.sleep((long) (Math.random()*10)*100);//每執行一次就開始休眠 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } c.get();//消費者開始取走商品 } } } public class producer implements Runnable{ private Clerk c; public producer(Clerk c){ this.c=c; } @Override /** * 生產者開始生產商品 */ public void run() { System.out.println("生產者開始生產商品"); while(true){ try { Thread.sleep((long) (Math.random()*10)*110); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }//每生產一次就開始休眠,休眠時間隨機 c.add(); } } } public class mian { public static void main(String[] args) { Clerk c=new Clerk();//new一下cleark類 取名爲c Thread co=new Thread(new consumer(c));//new一下生產者類 取名爲co Thread pr=new Thread(new producer(c));//new一下消費者類 取名爲pr co.start();//執行生產者方法 pr.start();//執行消費者方法 } }
這個程序模擬了現實生產者與消費者問題,生產者生產商品同時消費者購買商品。而且模擬了一個商店,當商店內的商品售罄時通知生產者生產商品,當商店內的倉庫滿了時等待消費者購買,而且通知生產者暫停生產。java