package com.aaa; /* * * 面包作坊,如果数量低于100个,工人就会生产,如果数量高于280,工人将不会生产,并通知用户来进行购买 * * 如果用户面包数量不够,通知工人来生产面包,如果数量够了就购买面包 * * * * 如果工人发现数量够了就是wait,不够就生产并通知购买 * 如果用户发现数量够了就买再wait,如果不够就通知生产 * * notifyAll() ::唤醒其它正在等待的线程 * wait():让当前线程等待,只到有人唤醒他 */ public class BreadFactory { private int count = 200; //面包坊生产的方法 public synchronized void produce(int i){ try { Thread.sleep(3000); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } if(count >= 280){ try { wait();//发现数量足够,去等待,等到其它线程将其叫醒来生产 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"--"+"面包数量足够不用生产,现有面包"+count); }else{ count = count + i; notifyAll();//通知其它线程,可以醒过来,购买面包或者生产面包 System.out.println(Thread.currentThread().getName()+"--"+"面包数量不足,生产"+i+"个,现有面包"+count); } } public synchronized void sell(int i){ try { Thread.sleep(3000); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } if(i <= count){ count = count - i; System.out.println(Thread.currentThread().getName()+"--"+"面包数量足够,买走面包"+i+"个,还有"+count+"人"); try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ System.out.println(Thread.currentThread().getName()+"--"+"面包数量不足,要"+i+"个,但仅有"+count+"个"); notifyAll();//数量不够来生产 } } }
package com.aaa; public class Worker extends Thread{ private BreadFactory bf; private int count; public Worker(BreadFactory bf,int count){ this.bf = bf; this.count = count; } public void run(){ while(true){ bf.produce(count); } } }
package com.aaa; public class TestBread { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub BreadFactory bf = new BreadFactory(); Consumer c0 = new Consumer(bf,100); c0.setName("c0"); Consumer c1 = new Consumer(bf,200); c1.setName("c1"); Consumer c2 = new Consumer(bf,80); c2.setName("c2"); Worker w0 = new Worker(bf,30); w0.setName("w0"); Worker w1 = new Worker(bf,100); w1.setName("w1"); Worker w2 = new Worker(bf,60); w2.setName("w2"); c0.start(); c1.start(); c2.start(); w0.start(); w1.start(); w2.start(); } }