生产者安全地将数据交给消费者。
producer是生产者的意思:指生产数据的线程,consumer是消费者的意思,指的是使用数据的线程。
例如消费者想要获取数据,可数据还没生成,或者生成者想要交付数据,而消费者的状态还无法接受数据这样的情况。这个时候Producer-Consumer模式在生产者和消费者之间加入了一个“桥梁角色”,该桥梁角色用于消除线程间处理速度的差异。
这是一个实例图,方便理解Producer-Consumer模式:
下面来看一个实例:
MakerThread用于制作蛋糕,并将其放入到桌上,也就是糕点师
public class MakerThread extends Thread{
private final Random random;
private final Table table;
private static int id = 0;//蛋糕的流水号(所有糕点师共用)
public MakerThread(String name,Table table,long seed){
super(name);
this.table = table;
this.random = new Random(seed);
}
public void run(){
try {
while(true){
Thread.sleep(random.nextInt(1000));
String cake = "[Cake No."+nextId()+" by "+getName()+"]";
table.put(cake);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static synchronized int nextId(){
return id++;
}
}
EaterThread类用于表示从桌子上取蛋糕吃的客人
public class EaterThread extends Thread{
private final Random random;
private final Table table;
public EaterThread(String name,Table table,long seed){
super(name);
this.table = table;
this.random = new Random(seed);
}
public void run(){
try {
while(true){
String cake = table.take();
Thread.sleep(random.nextInt(1000));
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Table用于表示放置蛋糕的桌子。
String[] buffer,存放蛋糕的数组
tail:表示下一次放置蛋糕的位置
head:表示下一次取蛋糕的位置
count:表示当前桌子上放置的蛋糕数
public class Table {
private final String[] buffer;
private int