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();//执行消费者方法 } }
这个程序模拟了现实生产者与消费者问题,生产者生产商品同时消费者购买商品。并且模拟了一个商店,当商店内的商品售罄时通知生产者生产商品,当商店内的仓库满了时等待消费者购买,并且通知生产者暂停生产。