通俗来讲,生产者就是好比如吃自助的时候的厨师,消费者就是我们吃自助的人。只有厨师做了菜,消费者才可以吃;而当没有人吃的时候厨师停止做菜。
在 Java 中,负责产生数据的模块是生产者,负责使用数据的模块是消费者. 生产者消费者解决数据的平衡问题,即先有数据然后才能使用,没有数据时,消费者需要等待。
在此可能生产者与消费者的数量可能是:
1.一个生产者与一个消费者
2.一个生产者多个消费者
3.多个生产者多个消费者
简单地代码例示如下:
package com.company.producerdata;
/***
* 定义一个操作数据的类
*/
public class ValueOP {
private String value="";
//定义方法修改value字段的值
public void setValue(){
synchronized (this){
//如果value的值不是空串就等待
while (!value.equalsIgnoreCase("")){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//如果是空串设置value字段的值
String value=System.currentTimeMillis()+"-"+System.nanoTime();
System.out.println("set设置的值是:"+value);
this.value=value;
//this.notify();//只能唤醒一个线程,在多生产者多消费者环境中,不能保证生产者唤醒消费者,如果生产者唤醒生产者可能会出现假死情况
this.notifyAll();
}
}
//定义方法获取字段的值
public void getValue(){
synchronized (this){
//如果value是空串就等待
while (value.equalsIgnoreCase("")){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//不是空串,读取字段值
System.out.println("get的值是"+this.value);
this.value="";
this.notifyAll();
}
}
其实在遇到这种问题时,只需要将判断if更改为while,将notify()更改为notifyAll()即可。