首先要清楚一共4几个对象
1,生产者2.消费者3.产品4.容器
容器必须要有一个容量,通俗来讲,就是你的容器可以装多少产品,这是有限的。
生产者可以生产产品然后放到容器中,消费者可以消费产品,(把产品从容器中拿出来)
如果容器没有产品,消费者拿不到,那么通知生产者去生产,生产者生产了,又去通知消费者去拿。
如果容器已经满了,生产者会暂停生产,然后通知消费者去容器里拿产品。
话不多说,上代码
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
/**
* @ProductName:
* @ProjectName:
* @Package:
* @Description:
* @Author:四叶总会来的
* @Date:
* @UpdateRemark:
* @Version: 1.0
* <p>
*/
@Slf4j
public class ProduceAndConsumer {
public static void main(String[] args) {
Container container=new Container(new Product[10]);
Consumer consumer=new Consumer(container);
Productor productor=new Productor(container);
consumer.start();
productor.start();
}
}
/**
* 生产者
*/
class Productor extends Thread {
//生产产品
/**
*
*/
Container container;
/**
*
*/
public Productor(Container container) {
this.container = container;
}
@SneakyThrows
@Override
public void run() {
while (true) {
container.push(new Product("q","1"));
}
}
}
/**
* 消费者
*/
class Consumer extends Thread {
//消费产品
/**
*
*/
Container container;
/**
*
*/
public Consumer(Container container) {
this.container = container;
}
@SneakyThrows
@Override
public void run() {
while (true) {
container.pob();
// Thread.sleep(100);
}
}
}
/**
* 产品
*/
class Product {
/**
*
*/
private String name;
/**
*
*/
private String num;
public Product(String name, String num) {
this.name = name;
this.num = num;
}
}
/**
* 容器
*/
@Slf4j
class Container {
public Product[] getProduct() {
return product;
}
public void setProduct(Product[] product) {
this.product = product;
}
/**
*
*/
private Product[] product;
/**
*
*/
private Integer count;
public Container(Product[] product) {
this.product = product;
this.count =-1;
}
/**
* v
*
* @param p
*/
public synchronized void push(Product p) throws InterruptedException {
if (count <product.length-1) {
//容器没有满,可以放东西
count++;
product[count] = p;
log.info("位置" + count + "放入了一个产品");
Thread.sleep(100);
this.notify();
} else {
log.info("等待---->生产失败,容器已满"+count);
this.wait();
// Thread.sleep(1000);
}
}
public synchronized void pob() throws InterruptedException {
if (count < product.length && count >=0) {
//容器有产品,可以消费
log.info("消费了位置为" + count + "的产品");
count--;
this.notify();
Thread.sleep(100);
} else {
log.info("等待---->消费失败,数量为" + count);
this.wait();
}
}
}