生产者消费者模式:是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不 直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者理。
生产者生产一个产品消费者就消费一个,当没有产品供消费者消费之后生产者才进行生产产品
商品类
class Product{
private String brand;
private String name;
//用来控制生产者与消费者之间的轮流执行,false代表没有商品true代表有商品
private boolean flag=false;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//生产者的同步方法
public synchronized void setProduct(String brand,String name){
//有商品,让消费者消费,生产者线程等待
if (flag==true){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//没有商品,生产商品
this.setBrand(brand);
this.setName(name);
System.out.println("生产了这个---" + this.getBrand() + "---品牌的---" + this.getName());
flag=true;//生产完商品,让消费者消费
notify();//让消费者线程执行
}
//消费者的同步方法
public synchronized void getProduct(){
//是否有商品,没有则等待生产者线程执行生产商品
if (flag==false){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//有商品并消费
System.out.println("消费了这个---" + this.getBrand() + "---品牌的---" + this.getName());
flag=false;//没有商品
notify();//让生产者线程执行
}
}
生产者线程类
class ProductThread extends Thread{
private Product p;
public ProductThread(Product p) {
this.p = p;
}
@Override
public void run() {
for (int i = 1; i <=10 ; i++) {
if (i%2==0){
p.setProduct("雪花","啤酒");
}else {
p.setProduct("青岛","啤酒");
}
}
}
}
消费者线程类
class ConsumerThread extends Thread{
private Product p;
public ConsumerThread(Product p) {
this.p = p;
}
@Override
public void run() {
for (int i = 1; i <=10 ; i++) {
p.getProduct();
}
}
}
存在的问题
1.值为空
解决:写同步代码块或者同步方法、用锁
2.不按照生产一个消费一个
解决:定义一个Boolean类型的变量,false代表无商品需要生产,true代表有商品需要消费 并且使用两个线程的方法wait()和noity()