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();
}
}