生产消费(管程法)
【小城贝尔】
商品存入物资馆,锁住出入严看管。
计数标志算库存,等待唤醒新线程。
管在生产消费中,操作互异资源同。
生产之时管要空,完毕唤醒消费疯。
消费之后要生产,自己等待要人管。
package concurrently.CorrespondenceThred;
public class PipeDemp {
}
class SteamedBun{
int id;
public SteamedBun(int id) {
this.id = id;
}
}
class Basket{
SteamedBun[] sd = new SteamedBun[10];
//统计容器中的个数
int count = 0;
//添加包子
public synchronized void push(SteamedBun steamedBun){
//如果篮子没有空间就等待
if(count == sd.length){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//有空间就放
sd[count++] = steamedBun;
System.out.println(Thread.currentThread().getName()+"放入了馒头 他的id是 =========》 "+steamedBun.id);
//放了之后通知消费
this.notifyAll();
}
//取包子
public synchronized SteamedBun take(){
//如果没有就等待生产
if(count == 0){
try {
System.out.println(" 如果没有就等待生产 wait ,,,,, ");
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//如果有就取
SteamedBun ss = sd[--count];
System.out.println(Thread.currentThread().getName()+"取出了馒头 他的id是 =========》 "+ss.id);
//取了之后通知生产
this.notifyAll();
return ss;
}
}
class Productor extends Thread {
Basket basket;
public Productor(Basket basket) {
this.basket = basket;
}
@Override
public void run() {
for (int i = 0; i < 10; i ++) {
basket.push(new SteamedBun(i));
}
}
}
class Consumer extends Thread{
Basket basket;
public Consumer(Basket basket) {
this.basket = basket;
}
@Override
public void run() {
for (int i = 0; i < 10; i ++) {
basket.take();
}
}
}
class TestModle{
public static void main(String[] args) {
Basket b = new Basket();
Consumer c = new Consumer(b);
c.setName("消费者一");
Productor p = new Productor(b);
p.setName("生产者一");
Consumer c1 = new Consumer(b);
c1.setName("消费者二");
c1.start();
p.start();
c.start();
/*
如果没有就等待生产 wait ,,,,,
如果没有就等待生产 wait ,,,,,
生产者一放入了馒头 他的id是 =========》 0
生产者一放入了馒头 他的id是 =========》 1
生产者一放入了馒头 他的id是 =========》 2
生产者一放入了馒头 他的id是 =========》 3
生产者一放入了馒头 他的id是 =========》 4
生产者一放入了馒头 他的id是 =========》 5
生产者一放入了馒头 他的id是 =========》 6
生产者一放入了馒头 他的id是 =========》 7
生产者一放入了馒头 他的id是 =========》 8
生产者一放入了馒头 他的id是 =========》 9
消费者一取出了馒头 他的id是 =========》 9
消费者一取出了馒头 他的id是 =========》 8
消费者二取出了馒头 他的id是 =========》 7
消费者一取出了馒头 他的id是 =========》 6
消费者二取出了馒头 他的id是 =========》 5
消费者一取出了馒头 他的id是 =========》 4
消费者二取出了馒头 他的id是 =========》 3
消费者一取出了馒头 他的id是 =========》 2
消费者二取出了馒头 他的id是 =========》 1
消费者一取出了馒头 他的id是 =========》 0
如果没有就等待生产 wait ,,,,,
如果没有就等待生产 wait ,,,,,
*/
}
}